Какой самый быстрый файл / способ для анализа большого файла данных?

Поэтому я работаю над проектом GAE. Мне нужно искать города, названия стран и коды стран для регистрации, LBS и т. Д.

Теперь я решил, что помещать всю информацию в хранилище данных довольно глупо, так как она будет использоваться довольно часто, и это может поглотить мои цитаты хранилища данных без причины, особенно потому, что эти списки не будут меняться, поэтому бессмысленно помещать хранилище данных.

Теперь у меня остается несколько вариантов:

API - Нет бюджета на платные услуги, бесплатные не совсем надежны.

Upload Parse-способны файл - Благоприятный вариант, так как мне нравится уверенность, что данные всегда будут там. Итак, я получил необходимые файлы от GeoNames (ссылка содержит исходные файлы для всех стран на случай, если это кому-то понадобится). Файл для каждой страны - это обычный файл с разделителями-табуляциями UTF-8, который великолепен.

Однако теперь, когда у меня есть возможность выбрать способ форматирования и доступа к данным, возникает вопрос:

Каков наилучший способ систематического форматирования и извлечения данных из статического файла в контейнере сервлетов Java?

Лучший способ - самый быстрый и наименее ресурсоемкий метод.

Допустимые варианты:

  1. TXT файл, разделитель табуляции
  2. Статический файл XML
  3. Java класс с тоннами перечислений

Я знаю, что импорт файлов стран в формате Java Enums и просмотр их значений будут очень быстрыми, но думаете ли вы, что это повлияет на память за разумные пределы? С другой стороны, каждый раз, когда мне нужно получить доступ к записи, цикл будет проходить через несколько тысяч строк, пока не найдет нужную запись... чтение строки за строкой, поэтому проблем с памятью нет, но невероятно медленно... некоторый опыт разбора файла excel в сервлете Java, и потребовалось около 20 секунд, чтобы просто проанализировать 250 записей, в больших масштабах время отклика БУДЕТ (вне всяких сомнений), так что XML - что-то вроде excel??

Большое спасибо, ребята! Пожалуйста, предоставьте мнения, все и все ценится!

2 ответа

Решение

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

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

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

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

Если список действительно большой, вы можете разбить его на несколько меньших файлов и анализировать их только тогда, когда они требуются. Разумное и простое разбиение будет разбивать его по странам, но любое другое разбиение будет работать (например, на основе его имени, используя первые несколько символов из его имени).

Вы также можете рассмотреть возможность создания этого Map в памяти один раз, а затем сериализовать эту карту в двоичный файл, и включить этот двоичный файл в качестве статического файла ресурсов, и таким образом вам придется только десериализовать это Map и не было бы необходимости анализировать / обрабатывать его как текстовый файл и создавать объекты самостоятельно.

Улучшения в файле данных

Альтернативой наличию статического файла ресурсов в виде текстового /CSV-файла или сериализованного файла данных карты может быть его наличие в виде файла двоичных данных, в котором вы можете создать свой собственный формат файла.

С помощью DataOutputStream Вы можете записать данные в двоичный файл очень компактным и эффективным способом. Тогда вы могли бы использовать DataInputStream загрузить данные из этого пользовательского файла.

Преимущество этого решения в том, что файл может быть намного меньше (по сравнению с обычным текстом / CSV / сериализованной картой), и его загрузка будет намного быстрее (потому что DataInputStream например, не использует разбор чисел из текста, он читает байты числа напрямую).

Храните данные в исходной форме как XML. В начале дня или когда он меняется, считайте его в память: это единственный раз, когда вы платите за анализ. Тогда есть два основных варианта:

(а) ваша форма в памяти все еще является деревом XML, и вы используете XPath/XQuery для ее запроса.

(б) ваша форма в памяти - это что-то вроде java HashMap

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

Другие вопросы по тегам