2013-11-06 3 views
0

Я пытаюсь прочитать файл (вкладка или файл csv) в java с примерно 3-мя строками; также добавили память виртуальной машины в -Xmx6g. Код отлично работает с 400K строк для файла с разделителями вкладок и немного меньше для файла csv. Есть много связанных LinkedHashMaps и Vectors, которые я пытаюсь использовать System.gc() после каждых нескольких сотен строк, чтобы освободить значения памяти и мусора. Тем не менее, мой код дает следующую ошибку после 400K строк.Размер кучи Java и OutofMemory

Исключение в потоке «основного» java.lang.OutOfMemoryError: Java куча пространства

at java.util.Vector.<init>(Vector.java:111) 
at java.util.Vector.<init>(Vector.java:124) 
at java.util.Vector.<init>(Vector.java:133) 
at cleaning.Capture.main(Capture.java:110) 
+7

'System.gc()' вызовы - это потраченное впустую действие. Вы можете свободно их удалить. –

+4

Пришло время использовать базу данных? –

+1

Возможно, вы захотите пересмотреть свой подход для обработки этого объема данных, не пытаясь загрузить все в память. Вы можете попробовать обработать его кусочком (вплоть до строки). - То, что вы реализовали, похоже, все, кроме масштабируемого. – A4L

ответ

4

Попытка загрузить весь файл в корне злополучный. Вы можете оптимизировать все, что хотите, но вы просто немного поднимете верхний предел. То, что вам нужно, это искоренение самого предела.

Существует очень незначительная вероятность того, что вам действительно понадобится все содержимое в памяти сразу. Вам, вероятно, нужно вычислить что-то от этих данных, поэтому вы должны приступить к разработке способа сделать этот кусок расчёта куском, каждый раз имея возможность выбросить обработанный кусок.

Если ваши данные глубоко переплетаются, что мешает вам сериализовать ваши расчеты, тогда разумный регресс, как упоминает выше, HovercraftFOE, передает данные в базу данных и работает оттуда, индексируя все, что вам нужно, нормализуя его и т. Д.

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