Обработка файла с многопоточностью в perl - PullRequest
2 голосов
/ 16 июня 2011

Я ищу общий процесс в PERL, похожий по концепции на mapreduce, в котором при заданном входном файле в perl у меня может быть #N (заданное пользователем число) различных файловых дескрипторов, которые считывают из разных частей файла.

Другими словами, вместо чтения файла через один дескриптор, я хотел бы читать его из #N разных блоков одновременно. Для этого в идеале я бы предпочел не делить файлы на #N разных суб-файлов. Было бы хорошо, если бы один файл мог быть прочитан из разных мест с помощью не мешающих файловых дескрипторов без какой-либо утечки данных.

Последующая цель - запустить задания типа #N mapper для данных, считываемых каждым дескриптором файла, а затем, как только все будет сделано, я использую вещь, похожую на редуктор, для объединения выходных данных каждого преобразователя.

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

Буду признателен за ваши комментарии.

Спасибо! Абхи

1 Ответ

7 голосов
/ 16 июня 2011

Команда seek может переместить курсор дескриптора файла в произвольную позицию в файле. Если вы знаете размер файла, вы можете сделать что-то вроде:

  1. Выберите N точек, равномерно распределенных по всему файлу.
  2. Открыть N файловых дескрипторов файла
  3. Разместите каждый дескриптор файла seek в отдельной точке файла.
  4. На каждом дескрипторе файла читайте, пока не дойдете до начала строки (запись, что угодно)
  5. Обрабатывайте файл, пока не получите запись после следующего пункта. Команда tell сообщит вам текущую позицию во время обработки.
...