rExcel getarraytovba ограничение по размеру

У меня есть некоторый код R, который возвращает матрицу, которая имеет ширину 12 столбцов и более 1M строк. Когда я пытаюсь использовать getarraytovba, чтобы вернуть эту матрицу в вариант VBA, это терпит неудачу. Когда я говорю, что это не удается, я имею в виду, что он выполняет код без каких-либо ошибок, но переменная VBA будет пустой. Если я уменьшу матрицу R до 5000 строк, VBA перехватит переменную. Если это между 5000 и 20000 (парк мячей), то иногда это будет работать, а иногда нет. Моя система имеет 16 ГБ оперативной памяти и используется только на 40%, когда я пытаюсь переместить данные в VBA. Использование памяти, кажется, не меняется, так как у меня открыт диспетчер задач, когда я запускаю код.

Я погуглил тему, и единственный ответ, который я нашел, состоит в том, что она ограничена физической памятью, но, поскольку у меня есть почти 10 ГБ свободной памяти, я думаю, что это еще не все. Может ли кто-нибудь помочь мне пролить свет на то, почему гетаррайтовба так ограничивает?

1 ответ

Решение

Я написал следующее в VBA, чтобы устранить недостаток...

Public Function returnresults()
Dim lResultsize As Long
Dim sBigblock As Variant
Dim lLow As Long
Dim lHigh As Long
Dim vTemp As Variant
Dim i As Long
Dim j As Long
Dim lBigrow As Long
Dim lFullresults As Long
rinterface.RRun "abc<-length(vbaget[,1])"
lFullresults = rinterface.GetRExpressionValueToVBA("abc")
lResultsize = lFullresults
If lResultsize > 1048575 Then
MsgBox "Results exceed 1,048,575 rows.  Excess will be dropped."
lResultsize = 1048575
End If
sBigblock = ThisWorkbook.Sheets("results").Range("a2:m" & lResultsize + 1)
lHigh = lResultsize
lLow = 1
If lResultsize > 3000 Then lHigh = 3000

lBigrow = 1
Do While lHigh <= lResultsize And lLow < lHigh
    rinterface.RRun "temp<-vbaget[" & lLow & ":" & lHigh & ",]"
    vTemp = rinterface.GetArrayToVBA("temp")
        For i = 0 To UBound(vTemp, 1)
            For j = 1 To 13 'This is number of columns in array it could be dynamic
                sBigblock(lBigrow, j) = vTemp(i, j - 1)
            Next j
            lBigrow = lBigrow + 1
        Next i
    lLow = lHigh + 1
    lHigh = lLow + 2999
    If lHigh > lResultsize Then lHigh = lResultsize
Loop

ThisWorkbook.Sheets("results").Range("a2:m" & lResultsize + 1) = sBigblock
End Function
Другие вопросы по тегам