Сравнение производительности и выполнение запросов с двумя действительно большими CSV-файлами в JAVA - PullRequest
0 голосов
/ 17 июня 2019

Мне нужно сравнить два CSV-файла, каждый из которых имеет от 500000 до 900000 строк (да, они большие), и я хотел бы знать, какой из них лучший.

Что мне нужно сделать

  • Удалить строки в CSV1, которых нет в CSV2, используя значение ключа (код)
  • Удалить строки с каждой стороны в определенные часы
  • Показать разницу в некоторых полях, таких как «Количество», с фильтрацией по таким полям, как «Город» или «Дата»

Я мог бы попытаться сохранить каждый CSV-файл в списке JAVA и создать базу данных (используя SQLite) с конечным результатом (различия и удаленные строки), а затем выполнить запросы к этой базе данных, например, выбрать только из одного города. из некоторых дат / часов или кодов (или даже всех их одновременно, конечный пользователь будет применять фильтры из интерфейса, используя флажки или комбинированные списки)

Каждый CSV-файл выглядит примерно так

CITY;       CODE;          DATETIME;       Quantity
city1; city_1_code_1; DD/MM/YYYY hh:mm:ss;   2500

Я не уверен, что это лучший способ сделать это с точки зрения производительности. Должен ли я хранить данные в памяти и просто использовать списки для сравнения? если нет, то для этого достаточно использовать SQLite? или я должен использовать что-то другое? Мне не хватает лучшего способа сделать эту операцию?

Я разрабатываю это с использованием JavaFX, и результаты должны быть показаны в таблице (это совсем не проблема, просто чтобы вы оказались в контексте)

Заранее спасибо, и дайте мне знать, если вам нужно что-то знать

1 Ответ

1 голос
/ 17 июня 2019

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

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

Если вы решите использовать списки в памяти, вы можете рассмотреть возможность использования одной из высокопроизводительных библиотек коллекций, доступных в экосистеме Java.,Я не могу рекомендовать ни одного, но вы можете взглянуть, например, здесь , чтобы получить представление.Однако есть вероятность, что, если вы не будете работать во всей коллекции очень часто, подход SQLite может все еще быть более быстрым (опять же, тестирование является ключевым).

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

...