Я профилировал мое приложение, и, похоже, одним из моих самых узких мест на данный момент является метод String.split
. Это занимает 21% от моего времени выполнения, а другие крупные участники не являются частями, которые я могу упростить, чем они есть. Похоже, что все вновь созданные объекты String
вызывают проблемы с сборщиком мусора, хотя я не знаю, является ли это случаем.
Я читаю в gzipped файле значения, разделенные запятой, содержащие финансовые данные. Количество полей в каждой строке варьируется в зависимости от того, какой тип записи она имеет, и размер каждого поля тоже меняется. Какой самый быстрый способ прочитать данные, создавая наименьшее количество промежуточных объектов?
Я видел эту тему, но ни один из ответов не дает никаких доказательств того, что OpenCSV быстрее, чем String.split
, и все они, похоже, сосредоточены на использовании внешней библиотеки, а не на записи нового кода. Я также очень беспокоюсь о накладных расходах памяти, потому что я трачу еще 20% от общей производительности, выполняющей сборку мусора. Я хотел бы просто вернуть вид строки, о которой идет речь, но похоже, что это невозможно.
Более быстрый способ - использовать только простой StringTokenizer
. Он не имеет накладных расходов на регулярное выражение для split()
и он находится в JDK.
Используйте синтаксические анализаторы uniVocity для анализа файла CSV. Это набор парсеров для текстовых форматов таблиц, а его синтаксический анализатор CSV является самым быстрым среди всех других парсеров для Java (как вы можете видеть здесь, и здесь). Раскрытие информации: Я являюсь автором этой библиотеки. Это с открытым исходным кодом и бесплатно (лицензия Apache V2.0).
Мы использовали архитектуру, предоставленную этой средой, для создания пользовательского парсера для файлов дампа MySQL для этого проекта. Нам удалось проанализировать файл дампа размером 42 ГБ за 15 минут (1+ миллиард строк).
Он должен решить вашу проблему.
Если вы не хотите использовать библиотеку, альтернативой StringTokenizer
будет писать простой конечный автомат для анализа вашего CSV. У Tokenizers могут быть проблемы с запятыми, встроенными в поля. CSV - достаточно простой формат, поэтому нетрудно построить конечный автомат для его обработки. Если вы точно знаете, что такое формат входного файла, вы можете упростить его еще больше, так как вам не придется иметь дело с любыми возможностями, отсутствующими в вашем конкретном файле.
Числовые данные потенциально могут быть преобразованы прямо в int
на лету", без необходимости одновременного хранения большого количества строк.