Как я могу обрабатывать несколько файлов одновременно? - PullRequest
1 голос
/ 23 сентября 2011

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

Теперь мне нужно создать среду для эффективной обработки этих файлов.Я знаю, что Java не масштабируется с точки зрения параллельной обработки ввода / вывода.Я имею в виду наличие потока монитора, который сканирует этот каталог, выбирает имена файлов и помещает их в службу Executor Service или в некоторую очередь блокировки Java.Группа рабочих потоков (возможно, небольшое количество для проблем ввода / вывода), слушающих в службе executor, прочитает файлы, прочитает файлы HTML внутри и выполнит соответствующую обработку.Это сделано для того, чтобы потоки не боролись за один и тот же файл.

Это правильный подход с точки зрения производительности и масштабируемости?Кроме того, как обращаться с файлами после их обработки?В идеале, файлы должны быть перемещены или помечены, чтобы они больше не попадали в поток.Может ли это быть обработано через объекты Future?

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

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

Если вы используете Java 7, вы можете воспользоваться WatchService (как предлагает Simeon G).

Если вы ограничены Java 6 или более ранней версией, эти службы недоступны в JRE. Однако Apache Commons-IO обеспечивает мониторинг файлов. См. здесь .

В качестве преимущества перед Java 7 мониторы Commons-IO создадут для вас поток, который генерирует события для зарегистрированного обратного вызова. В Java 7 вам нужно будет самостоятельно опросить список событий.

Если у вас есть события, вы можете использовать ExecutorService для обработки файлов вне потока. Перемещение файлов поддерживается Java IO, и вы можете просто игнорировать любые возникающие события удаления.

Я успешно использовал эту модель в прошлом.

Вот некоторые вещи, на которые стоит обратить внимание:

  • Новое событие файла, скорее всего, будет вызвано, если файл существует в каталоге. ОДНАКО, данные все еще будут записываться в него. Примите во внимание разумные ожидания относительно размера файла и того, как долго вам нужно ждать, пока файл не будет считаться «целым»

  • Какое максимальное количество времени вы должны потратить на файл?

  • Настройте параметры службы исполнителя с помощью конфигурации - это упростит тестирование производительности

Надеюсь, это поможет. Удачи.

1 голос
/ 23 сентября 2011

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

...