0

我有一些 R 代码返回一个 12 列宽、超过 1M 行的矩阵。当我尝试使用 getarraytovba 将该矩阵返回到 VBA 变体时,它失败了。当我说它失败时,我的意思是它运行代码而不产生任何错误,但 VBA 变量将为空。如果我将 R 矩阵缩小到 5000 行以下,那么 VBA 将捕获该变量。如果它在 5000 到 20000 之间(球场),那么有时它会起作用,有时它不会。我的系统有 16GB 的内存,当我试图将数据移动到 VBA 时,它的利用率只有 40%。内存使用似乎没有改变,因为我在运行代码时打开了任务管理器。

我已经用谷歌搜索了这个主题,我发现的唯一答案是它受到物理内存的限制,但由于我有近 10GB 的可用内存,我认为它不仅仅如此。谁能帮我解释一下为什么 getarraytovba 如此受限制?

4

1 回答 1

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
于 2013-01-21T16:27:51.923 回答