Разбор больших текстовых файлов в режиме реального времени (Java) - PullRequest
7 голосов
/ 23 апреля 2009

Я заинтересован в разборе довольно большого текстового файла на Java (1.6.x), и мне было интересно, какой подход (ы) будет считаться лучшей практикой?

Файл, вероятно, будет иметь размер около 1 МБ и будет состоять из тысяч записей по строкам;

Entry
{
    property1=value1
    property2=value2
    ...
}

и т.д.

Мой первый инстинкт - использование регулярных выражений, но у меня нет опыта использования Java в производственной среде, и поэтому я не уверен, насколько мощны классы java.util.regex.

Чтобы уточнить, мое приложение будет веб-приложением (JSP), которое анализирует рассматриваемый файл и отображает различные значения, которые оно получает. Анализируется только один файл (он находится в стороннем каталоге на хосте).

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

Кроме того, есть ли какие-либо меры предосторожности при загрузке файла в память каждый раз, когда он анализируется?

Кто-нибудь может порекомендовать подход, чтобы взять здесь?

Спасибо

Ответы [ 9 ]

8 голосов
/ 23 апреля 2009

Если это будет около 1 МБ и буквально в том формате, который вы указали, то это звучит так, как будто вы переигрываете.

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

Обновление: просто для того, чтобы дать вам конкретное представление о производительности, некоторые измерения, которые я произвел производительности String.split () (которая использует регулярные выражения), показывают, что на Для машины с частотой 2 ГГц требуется 10000 * миллисекунд, чтобы разделить 10000 строк по 100 символов (другими словами, около 1 мегабайта данных - на самом деле около 2 МБ чистого объема байтов, поскольку строки - 2 байта на символ). Обвиуали, это не совсем та операция, которую вы выполняете, но вы понимаете, что все не так плохо ...

5 голосов
/ 23 апреля 2009

Если это правильная грамматика, используйте компоновщик синтаксического анализатора, такой как GOLD Parsing System . Это позволяет вам указать формат и использовать эффективный анализатор для получения нужных токенов, получая обработку ошибок почти бесплатно.

4 голосов
/ 23 апреля 2009

Мне интересно, почему это не в XML, и тогда вы могли бы использовать доступные инструменты XML. Я имею в виду, в частности, SAX, и в этом случае вы можете легко разобрать / обработать это, не сохраняя все это в памяти.

Так вы можете преобразовать это в XML?

Если вы не можете и вам нужен парсер, взгляните на JavaCC

3 голосов
/ 23 апреля 2009

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

2 голосов
/ 23 апреля 2009

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

1 голос
/ 23 апреля 2009

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

хотя, глядя на рассматриваемый сценарий, это, кажется, не нужно.

1 голос
/ 23 апреля 2009

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

1 голос
/ 23 апреля 2009

Это кажется достаточно простым форматом файла, поэтому вы можете рассмотреть возможность использования Recursive Descent Parser . По сравнению с JavaCC и Antlr, его плюсы в том, что вы можете написать несколько простых методов, получить необходимые данные и вам не нужно изучать формализм генератора синтаксического анализатора. Его минусы - это может быть менее эффективным. Парсер рекурсивного спуска в принципе сильнее регулярных выражений. Если вы можете придумать грамматику для этого типа файлов, она будет служить вам для любого решения, которое вы выберете.

1 голос
/ 23 апреля 2009

Не отвечая на вопрос о разборе ... но вы можете анализировать файлы и генерировать статические страницы, как только поступят новые файлы. Таким образом, у вас не возникнет проблем с производительностью ... (И я думаю, что 1Mb не большой файл, поэтому вы можете загрузить его в память, если вы не загружаете слишком много файлов одновременно ...)

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