0

幅12列、行数100万を超える行列を返すRコードがあります。getarraytovbaを使用してその行列をVBAバリアントに戻そうとすると、失敗します。失敗するとは、エラーを生成せずにコードを実行することを意味しますが、VBA変数は空になります。Rマトリックスを5000行未満に縮小すると、VBAが変数をキャプチャします。5000から20000(ボールパーク)の間にある場合は、機能する場合と機能しない場合があります。私のシステムには16GBのRAMがあり、データを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 に答える