Нужно предложение по моему подходу: читать файл, который записывается непрерывно? - PullRequest
5 голосов
/ 04 декабря 2010

У меня есть один CSV-файл, который постоянно записывается с помощью сценария. Он записывает метку времени и некоторые другие данные в строке. Сначала я должен прочитать последние данные. В настоящее время я использую RandomAccessFile в Java, чтобы прочитать файл в обратном порядке. Но так как он написан постоянно, я должен читать новые данные с приоритетом. Я поддерживаю, какая временная метка была отправлена ​​и выполняю работу. Это приводит к ненужным операциям сканирования.

Есть ли лучший способ справиться с этим сценарием?

Заранее спасибо,

Ответы [ 5 ]

1 голос
/ 04 декабря 2010

Две идеи:

  1. Используйте формат записи фиксированного размера вместо CSV. Затем вы можете точно определить, в каких смещениях находятся ваши записи, вместо того, чтобы искать новые строки.

  2. Если это невозможно, создайте поток, который считывает элементы из файла и помещает их в стек. Другой поток извлекает элементы из стека и обрабатывает их. Поскольку это стек, он всегда будет иметь дело с самым последним доступным элементом. Вам нужно выяснить, как вы хотите справиться со случаями, когда стек становится слишком большим. Вы просто хотите выбросить слишком старые вещи?

1 голос
/ 04 декабря 2010

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

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

0 голосов
/ 04 декабря 2010

Если ваше приложение работает в среде Unix, вы можете запустить

tail -f /csv-file | custom-program

Пользовательская программа просто примет стандартный ввод и отобразит его в сокет-соединение с вашей Java-программой.

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

0 голосов
/ 04 декабря 2010

Это приводит к ненужным операциям сканирования.

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

Я могу придумать три способа сделать это, которые могут быть более эффективными, чем то, что вы делаете в настоящее время:

  1. Прочитать весь файл и разобрать строки в прямом направлении, сохраняя позиции в памяти. Затем обработайте строки в памяти в обратном порядке.

  2. Сканирование файла с самого начала в поисках начала строки и сохранение начальных позиций строки в памяти. Затем перебирайте позиции в обратном порядке, стараясь, чтобы каждая прочитала соответствующую строку. (Вы можете сделать ввод более эффективно, обрабатывая несколько строк в каждом поиске.)

  3. Отобразить файл в память, используя MappedByteBuffer, затем вы можете пошагово пройти через Байт-буфер вперед или назад, чтобы найти границы строк.

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

Но, в конечном счете, в Java нет простого и эффективного способа чтения файла в обратном направлении.

0 голосов
/ 04 декабря 2010

Если у вас есть доступ к исходному сценарию, запишите запись в базу данных, в дополнение к файлу CSV.Затем вы можете делать все, что вы хотите с базой данных;получить доступ к последней записи, запустить отчет и т. д.

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