WedX - журнал о программировании и компьютерных науках

Разбор больших текстовых файлов в режиме реального времени (Java)

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

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

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

и т.п.

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

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

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

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

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

Спасибо

23.04.2009

  • Вы имеете в виду в реальном времени или быстро? Они очень разные. Реальное время подразумевает, что вы даете ответ на каждый ввод, не дожидаясь нового ввода. Это часто медленнее, чем пакетная обработка. 23.04.2009
  • Кроме того, 1 мегабайт больше не считается большим, если вы не работаете на машине с менее чем 64 мегабайтами памяти. 23.04.2009
  • Я имею в виду быстро - я хочу, чтобы запрос был отправлен из веб-интерфейса на сервер, который будет сигнализировать о том, что он должен проанализировать файл и вернуть результаты (в любой подходящей структуре данных), а затем обработать их для отображения в Пользовательский интерфейс. 23.04.2009

Ответы:


1

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

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

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

23.04.2009
  • Достаточно справедливо - на самом деле я тоже задавался этим вопросом - если бы я перестарался с этой проблемой в своей голове. Думаю, я сделаю, как ты говоришь, и посмотрю, как у меня дела. Если производительность окажется проблемой, я могу вернуться и посмотреть варианты, предложенные другими ответами. Ваше здоровье. 23.04.2009
  • Честно говоря, я не думаю, что это будет - 1 МБ действительно не так уж много данных. 23.04.2009

  • 2

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

    23.04.2009

    3

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

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

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

    23.04.2009
  • Это сторонний файл журнала, формат которого я, к сожалению, не контролирую. 23.04.2009

  • 4

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

    23.04.2009
  • Расскажите, пожалуйста, как неоднозначны регулярные выражения. Да, разные варианты ведут себя по-разному, но все они (более или менее) задокументированы и непротиворечивы. Каждое выражение для данного аромата имеет точное и однозначное значение. 10.05.2009
  • Когда они (RegEx) усложняются, они не делают того, что люди считают, что они на самом деле делают. Реальные проблемы синтаксического анализа и их решения никогда не используют RegEx. Существуют ли компиляторы, написанные с использованием RegEx? 10.05.2009
  • @mP.Когда люди не склонны что-то понимать ясно, они часто называют это ДВУМЯЧНОСТЬЮ;; Просто дайте некоторое время, чтобы понять это, это значительно снижает усилия... 23.08.2012
  • @mP довольно иронично говорить, что «настоящие проблемы синтаксического анализа никогда не используют регулярные выражения ... Используйте класс сканера», учитывая, что сканер полностью построен на регулярных выражениях. 21.01.2014

  • 5

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

    23.04.2009

    6

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

    23.04.2009
  • Это один и тот же файл, который все время анализируется - отредактировал сообщение, чтобы уточнить это. 23.04.2009

  • 7

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

    23.04.2009

    8

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

    23.04.2009

    9

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

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

    23.04.2009
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]