Как распараллелить поиск строки в файле с помощью форка? (GNU Linux / g ++) - PullRequest
3 голосов
/ 11 октября 2008

Я получил текстовый файл с парой строк, и я ищу строку в этом файле. Мне нужно передать следующие параметры командной строки в программу:
- путь к файлу
- строка, которую я ищу
- максимальное количество процессов, которые программа может «разветвлять» для выполнения этой задачи.

Как такую ​​программу построить?

Ответы [ 4 ]

3 голосов
/ 11 октября 2008

Пара мыслей.

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

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


Насколько сильно вам это нужно? Это рискует быть преждевременной оптимизацией. Я бы рекомендовал не трогать проблему без насущной необходимости. На самом деле.

2 голосов
/ 11 октября 2008

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

1 голос
/ 12 октября 2008

Либо это домашнее задание, либо это бесполезно. Узким местом является пропускная способность диска, а не мощность процессора. Вы будете замедляться только при одновременном доступе.

1 голос
/ 12 октября 2008

Если вы действительно считаете, что это необходимо (или это домашнее задание?), (Относительно высокого уровня) путь может быть следующим:

  1. вычисляет размер файла для поиска (например, с помощью fopen, fseek (file, END), fclose)
  2. ассоциирует с каждым процессом два смещения в файле: смещение начала поиска и смещение конца поиска:
    startIndex = indexOfProcess * fileSize / numberOfProcesses
    endIndex = (indexOfProcess + 1) * fileSize / numberOfProcesses
    
    Вы должны принять во внимание тот факт, что строка для поиска может охватывать фрагменты для двух или более процессов, добавляя некоторое перекрытие (которое будет функцией размера строки).
  3. fork, откройте файл в каждом процессе (в режиме чтения), перейдите к начальному индексу, найдите строку, как если бы у вас был один файл размера (endIndex - startIndex), и выведите результаты на экран (или , если у вас есть более конкретные требования, сообщите нам о них).
...