2015-09-23 8 views
2

Что-то неожиданное происходит, когда я пытаюсь загрузить большой массив из файла CSV. Файл имеет 100000 строк и 100 столбцов (80 МБ). Я попробовал множество способов быстро загрузить CSV (потому что скорость имеет смысл). Приведенный ниже код отлично работает в первый раз, но когда я запускаю его во второй раз, заголовок переменной (String) или redim arrRaw (Variant) дает ошибку «из памяти». После перезагрузки Excel он отлично работает один раз. Они являются локально объявленными переменными. Я пытался использовать публичное объявление, а затем стирал массив, но это работало. Моя система не обнаруживает проблем с оперативной памятью. Есть ли проблема (или решение) этой проблемы?Недостаточный объем памяти

Open filepath For Binary Access Read As #i 
Get #i, , res 
Close i 

title = Split(Right(Left(res, Len(res) - 1), Len(Left(res, Len(res) - 1)) - 1), vbLf) 
columnsArr = UBound(Split(title(1), ";")) 
rowsArr = UBound(title) 

ReDim arrRaw(1 To rowsArr, 1 To columnsArr) 

Call timerClock(True) 

For i = 0 To rowsArr 
    TmpAr = Split(title(i), ";") 
    For j = 0 To UBound(TmpAr) - 1 
     If IsNumeric(TmpAr(j)) Then 
      arrRaw(i + 1, j + 1) = TmpAr(j) 
     Else 
      arrRaw(i + 1, j + 1) = 0 
     End If 
    Next j 
Next i 
+0

См. [Следует использовать теги в заголовках?] (Http://meta.stackexchange.com/help/tagging). – pnuts

ответ

0

Я неясный на то, что вы назначаете я (i = FreeFile ...?), Но, возможно, этот альтернативный метод свободного дескриптора файла очистит файл обрабатывать немного лучше.

Open filepath For Binary Access Read As #1 
Get #1, , res 
Close #1 

В любом случае, ваш собственный код должен, вероятно, использовать Close #i.

1

Вы настроили все переменные на «ничего» после завершения работы?

В любом случае, я хочу поделиться советом с вами: если вы работаете со строками в «title», замените все «Right» и «Left» на «Right $» и «Left $». Вы получите результат на 5 или 10% быстрее. Кроме того, старайтесь не делать те же два или более раз, как:

Left(res, Len(res) - 1) 

... Это будет лучше присвоить его переменной и работать с ним.