Предлагает ли платформа Apache Commons CSV эффективный для памяти инкрементный / последовательный режим для чтения больших файлов? - PullRequest
1 голос
/ 03 июня 2019

Проект Apache Commons CSV очень хорошо работает для анализа значений, разделенных запятыми, данных с разделителями табуляцией и аналогичных форматов данных.

У меня сложилось впечатление, что этот инструмент полностью читает файл с сохраненными в памяти строками объектов. Но я не уверен, я не могу найти какую-либо документацию относительно этого поведения.

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

Что касается только аспекта использования памяти, то здесь идея заключается в том, как синтаксический анализатор SAX для XML считывает постепенно, чтобы минимизировать использование оперативной памяти, по сравнению с синтаксическим анализатором XML в стиле DOM, который полностью считывает документ в память для обеспечения обхода дерева.

Вопросы:

  • Каково поведение Apache Commons CSV по умолчанию при чтении документов: полностью в память или инкрементно?
  • Можно ли изменить это поведение между инкрементным и целым документом?

1 Ответ

2 голосов
/ 03 июня 2019

У меня сложилось впечатление, что этот инструмент полностью считывает файл с результирующими строковыми объектами, хранящимися в памяти

Нет.Использование памяти зависит от того, как вы решите взаимодействовать с вашим CSVParser объектом.

Javadoc для CSVParser решает эту проблему в явном виде.

Я быстро взглянул на исходный код, и, действительно, кажется, что он читает из входного источникакусок за раз, а не все сразу.Но посмотрите сами .

Разбор записи мудрый

В разделе Разбор записи мудрый , он показывает, как постепенно читать одну CSVRecord навремя зацикливанием Iterable, то есть CSVParser.

CSVParser parser = CSVParser.parse(csvData, CSVFormat.RFC4180);
for (CSVRecord csvRecord : parser) {
    ...
}

Разбор в память

В отличие от Разбор в память В разделе показано использование CSVParser::getRecords для загрузки всех объектов CSVRecord в List одновременно в памяти.Поэтому очевидно, что очень большой входной файл может выбить память на компьютере с ограниченными возможностями.

Reader in = new StringReader("a;b\nc;d");
CSVParser parser = new CSVParser(in, CSVFormat.EXCEL);
List<CSVRecord> list = parser.getRecords();
...