我有一些R代码返回一个12列宽的矩阵,超过1M行。当我尝试使用getarraytovba将该矩阵返回到VBA变体时,它会失败。当我说它失败时,我的意思是它运行代码而不会产生任何错误,但VBA变量将为空。如果我将R矩阵缩小到5000行以下,那么VBA将捕获变量。如果它在5000到20000之间(球场),那么有时它会工作,有时它不会。我的系统有16GB的ram,当我试图将数据移动到VBA时,只有40%被使用。由于我在运行代码时打开了任务管理器,因此内存使用量似乎没有变化。
我已经搜索了这个主题,我发现的唯一答案就是它受到物理内存的限制,但由于我有近10GB的可用内存,我认为它还有更多内容。任何人都可以帮我解释为什么getarraytovba如此限制?
答案 0 :(得分:0)
我在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