Опросить список объектов из файла несколькими процессами синхронно - PullRequest
0 голосов
/ 03 сентября 2018

Вариант использования: У меня есть файл с идентификаторами в нем (около 500 КБ) Мое приложение читает эти файлы и обрабатывает их (обработка каждого идентификатора огромна). В целом, для этой обработки требуется много времени и памяти.

Что нам нужно сделать, так это увеличить число процессов (запустить процессы Java на отдельных компьютерах / блоках) и разделить весь список идентификаторов на несколько фиксированных размеров пакетов, чтобы 5 процессов начинали обрабатывать элементы из файла и выбирать до следующей партии всякий раз, когда ее обработка заканчивается. например. если общее количество элементов в файле равно 100, а размер пакета равен 5, а общее количество процессов - 3, то обработка должна быть такой, как

  • Процесс 1: 1-5
  • Процесс 2: 6-10
  • Процесс 3: 11-15

так, что если процесс 2 завершается раньше других процессов, он начинает обработку 16-20 и уведомляет об этом других, так что следующий доступный процесс выбирает пункты 21-25.

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

Может кто-нибудь, пожалуйста, предложить решения / ссылки, как это может быть достигнуто.

1 Ответ

0 голосов
/ 03 сентября 2018

Похоже, у вас проблемы с распределенными вычислениями. У вас есть набор «вещей для обработки», и вы хотите выполнять эту обработку на нескольких машинах. Самый простой и типичный способ сделать это - поместить эти «вещи для обработки» в распределенную очередь, такую ​​как Amazon SQS или RabbitMQ (файл не будет работать).

  1. Пусть один процесс (и только один) будет отвечать за передачу файла в распределенную очередь. Если вы можете полностью избежать файла (и иметь все, что записываете в файл, просто пишите в очередь), сделайте это вместо этого.
  2. Настройте несколько хостов (рассмотрим Amazon EC2) для чтения из этой очереди и выполнения обработки.
    • Убедитесь, что элемент удален из очереди после завершения обработки (и установите разумные тайм-ауты в зависимости от того, сколько времени должно занимать обработка), чтобы другой рабочий узел не мог подобрать элемент, когда он не должен.
    • Если хотите, вы можете извлекать из очереди по очереди или партиями. Я предлагаю настроить пул потоков на каждом хосте для выполнения цикла poll / work / delete, чтобы можно было легко настроить количество одновременных действий на хост, просто изменив размер пула потоков.

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

...