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