Параллельность при чтении файлов из файловой системы - PullRequest
1 голос
/ 15 ноября 2011

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

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

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

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

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

Есть ли лучшее решение проблемы?

Ответы [ 4 ]

1 голос
/ 15 ноября 2011

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

РЕДАКТИРОВАТЬ: добавлено слово "нет", поскольку оно довольно сильно меняет значениенемного ...

0 голосов
/ 17 ноября 2011

То, что вы описываете, напоминает мне о классическом стиле для разработки в UNIX.

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

Это работает, в основном, потому что перемещения файлов являются атомарными (по крайней мере, в системах Unix и NFTS).

Что приятно в этом подходе, так это то, что он довольно легко справляется с проблемными ситуациями, такими как сбои, и у него автоматически есть удобный интерфейс управления, с которым все знакомы (графический интерфейс файловой системы, ls, Windows Explorer, ...).

0 голосов
/ 15 ноября 2011

Взгляните на Apache Camel (http://camel.apache.org), и его компонент File (http://camel.apache.org/file2.html).). Использование Camel позволяет очень легко определить набор инструкций по обработке для использования файлов в каталоге атомарно, а также настроить пул потоков для работать с несколькими файлами одновременно. «Верблюд в действии» - отличная книга для начала работы.

0 голосов
/ 15 ноября 2011

Также взгляните на JDK 7. У него есть новый API ввода-вывода файлов и инфраструктура fork / join, которая может помочь.

...