параллельная обработка файлов - PullRequest
4 голосов
/ 09 марта 2011

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

Ответы [ 5 ]

3 голосов
/ 09 марта 2011

Используйте ExecutorService.Создайте Executors.newFixedThreadExecutor(n);, который вы, вероятно, можете превратить обработкой файла в одну выполняемую (или вызываемую) задачу и передать ее в файл, с которым можно работать

ExecutorService service = Executors.newFixedThreadExecutor(10);

for(final File file : directory.listFiles()){
   service.submit(new Runnable(){
        public void run(){
             //do work here on file object
        }
   });
}
1 голос
/ 09 марта 2011

Взгляните на API Watch Servie в java.nio.file. Вот документация и учебник: http://download.oracle.com/javase/tutorial/essential/io/notification.html

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

0 голосов
/ 09 марта 2011

Если я правильно понимаю, ваша единственная задача обрабатывается от чтения до загрузки в БД.Вы можете разбить эту задачу на другую задачу в зависимости от ее характера (в центре БД, ЦП или IO).Например, у вас могут быть следующие задачи:

  1. Текущая задача, которая выбирает файл из каталога и передает его следующей задаче.

  2. IOCentric - новая задача для чтения файла и сохранения в памяти, а затем перейти к следующим тактам.

  3. DB centric - новая задача для загрузки данных из памяти в базу данных, а затем очистки памяти.

  4. IO centric - переместить файл в другое место.

Для дальнейшего повышения производительности вы можете реализовать задачу 2, 3, 4, используя потокpool. Это позволит параллельно обрабатывать многие файлы.В зависимости от сложности задачи вы можете добавить или удалить любую задачу из списка в соответствии с вашими требованиями.

0 голосов
/ 09 марта 2011

Это не совсем очевидно, если вы знакомы с параллелизмом в Java, поэтому я бы начал с изучения Java Concurrency Tutorial .Это хорошее место для начала.

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

После этого вы можете создать пул потоков с помощью ExecutorService и одновременно запускать несколько потоков.

Я знаю, что по сути это не тот же процесс, но, если вы знаете, как обращаться с файлами, вы можете взглянуть на следующие вопросы о многопоточности в другом контексте: вопросы по синхронизации в Java;когда / как / в какой степени

Параллельная обработка в Java;нужен совет, например, по интерфейсам Runnanble / Callable

0 голосов
/ 09 марта 2011

создать класс saver extends Thread и обработать там обработку файла (в методе run())?


http://download.oracle.com/javase/tutorial/essential/concurrency/

http://download.oracle.com/javase/7/docs/api/java/lang/Thread.html

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