Самый быстрый способ прочитать CSV?

1

Я профилировал мое приложение, и, похоже, одним из моих самых узких мест на данный момент является метод String.split. Это занимает 21% от моего времени выполнения, а другие крупные участники не являются частями, которые я могу упростить, чем они есть. Похоже, что все вновь созданные объекты String вызывают проблемы с сборщиком мусора, хотя я не знаю, является ли это случаем.

Я читаю в gzipped файле значения, разделенные запятой, содержащие финансовые данные. Количество полей в каждой строке варьируется в зависимости от того, какой тип записи она имеет, и размер каждого поля тоже меняется. Какой самый быстрый способ прочитать данные, создавая наименьшее количество промежуточных объектов?

Я видел эту тему, но ни один из ответов не дает никаких доказательств того, что OpenCSV быстрее, чем String.split, и все они, похоже, сосредоточены на использовании внешней библиотеки, а не на записи нового кода. Я также очень беспокоюсь о накладных расходах памяти, потому что я трачу еще 20% от общей производительности, выполняющей сборку мусора. Я хотел бы просто вернуть вид строки, о которой идет речь, но похоже, что это невозможно.

  • 0
    ваши данные всегда будут целыми числами? если ваши данные содержат строки, ваш код потерпит неудачу, если он будет содержать строки типа «Hello, world!»
  • 0
    @MarcoAcierno Нет, они в основном не целые числа. Некоторые строки, некоторые числа с плавающей запятой, некоторые целые числа.
Показать ещё 2 комментария
Теги:
csv

3 ответа

1
Лучший ответ

Более быстрый способ - использовать только простой StringTokenizer. Он не имеет накладных расходов на регулярное выражение для split() и он находится в JDK.

0

Используйте синтаксические анализаторы uniVocity для анализа файла CSV. Это набор парсеров для текстовых форматов таблиц, а его синтаксический анализатор CSV является самым быстрым среди всех других парсеров для Java (как вы можете видеть здесь, и здесь). Раскрытие информации: Я являюсь автором этой библиотеки. Это с открытым исходным кодом и бесплатно (лицензия Apache V2.0).

Мы использовали архитектуру, предоставленную этой средой, для создания пользовательского парсера для файлов дампа MySQL для этого проекта. Нам удалось проанализировать файл дампа размером 42 ГБ за 15 минут (1+ миллиард строк).

Он должен решить вашу проблему.

0

Если вы не хотите использовать библиотеку, альтернативой StringTokenizer будет писать простой конечный автомат для анализа вашего CSV. У Tokenizers могут быть проблемы с запятыми, встроенными в поля. CSV - достаточно простой формат, поэтому нетрудно построить конечный автомат для его обработки. Если вы точно знаете, что такое формат входного файла, вы можете упростить его еще больше, так как вам не придется иметь дело с любыми возможностями, отсутствующими в вашем конкретном файле.

Числовые данные потенциально могут быть преобразованы прямо в int на лету", без необходимости одновременного хранения большого количества строк.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню