2013-01-09 3 views
0

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

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

+1

Что это вы хотите сделать с этим большими объемами данных в VBA? Считаете ли вы, что вы проводите весь свой анализ больших объемов данных на стороне R и передаете обратно результаты (небольшие сводные статистические данные, отчеты) в Excel/VBA? Вот как я всегда использовал RExcel. – flodel

+0

@flodel Это именно то, что я делаю, но хочу, чтобы можно было плюнуть на результаты (которые могут быть 10 или тысячи или даже миллионы строк) обратно в Excel. Я закончил создание функции, чтобы разделить матрицу R и перенести ее в строки VBA 3000 за раз. Это фиксировало это ... не идеально, но оно работает. –

+0

ИМХО, миллионы строк в Excel - плохой дизайн. Excel должен быть вашей приборной панелью, только для обеспечения ввода пользователя и представления небольших итоговых результатов. Большие данные должны быть в другом месте: на стороне R, подключении к базе данных и т. Д. Какое использование вы используете для этих миллионов строк в Excel? – flodel

ответ

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 
+0

Как представляется, не существует окончательной точки, в которой возвращение больших массивов будет успешным или неудачным, но чем больше массив, тем меньше вероятность успеха. Поскольку мои потребности в 3000 рядов всегда работают, но если кому-то это понадобится, им может понадобиться сократить строки, если они не работают. –

Смежные вопросы