Верблюд большой CSV-файл
Я пытаюсь обработать большой CSV-файл, содержащий примерно 1 миллион записей, и после чтения строк (строка / строка или фрагментами) мне нужно нажать это camel-flatpack
создать карту с именами полей и их значениями.
Мое требование состоит в том, чтобы передать все записи CSV в конфигурацию flatpack и создать из нее файл java.util.map.
Было несколько сообщений в stackru, чтобы решить эту проблему с помощью сплиттера, но мой процесс работает быстро до почти 35000 записей, но после этого он замедляется.
Я пытался даже добавить троттлер, он все еще не работает. Я получаю GC Out Of Memory Error. Я даже подстрелил JAVA_MIN_MEM
, JAVA_MAX_MEM
, JAVA_PERM_MEM
, JAVA_MAX_PERM_MEM
но результат тот же. Консоль Hawtio показывает, что JAVA_HEAP_MEMORY
примерно через 5-6 мин получается более 95%.
Вот мой фрагмент кода:
<route id="poller-route">
<from uri="file://temp/output?noop=true&maxMessagesPerPoll=10&delay=5000"/>
<split streaming="true" stopOnException="false">
<tokenize token="\n" />
<to uri="flatpack:delim:flatpackConfig/flatPackConfig.pzmap.xml?ignoreFirstRecord=false"/>
</split>
</route>
<route id="output-route">
<from uri="flatpack:delim:flatpackConfig/flatPackConfig.pzmap.xml?ignoreFirstRecord=false"/>
<convertBodyTo type="java.util.Map"/>
<to uri="mock:result"/>
</route>
1 ответ
Одна потенциальная проблема заключается в том, что когда вы создаете хеш-карты и непрерывно добавляете к ним данные, необходимо заново создать хеш-код. Например, если у меня есть хэш размером 3, и я ввожу в него 0,1,2,3, предполагая, что моя хэш-функция - мод 3, три будут назначены нулевому интервалу, создавая переполнение, поэтому мне нужно либо сохранить переполняет или воссоздает новый хэш.
Я уверен, что именно так java реализует свою хэш-карту, но вы можете попробовать инициализировать начальную емкость вашей хеш-карты с тем, сколько существует записей.