Запускать одну и ту же функцию параллельно с разными входными файлами и разными выходными файлами - PullRequest
0 голосов
/ 04 июля 2019

У меня есть метод в Python, который принимает большой файл в качестве ввода и возвращает файл в качестве вывода.

Я хочу распараллелить процесс, используя многопроцессорность (пул). Для этого я разделил входной файл, скажем, на 3 файла поменьше.

Мой метод:

     def A(self, input_file):
         ....
         ....
         ....
         output_file = out.txt #(path to output file)
         ....
         ....
         output_file = do_smth(input_file)
         return output_file

То, как я хочу повысить производительность с помощью многопроцессорной обработки:

         splited_input_file = split_file(input_file)
         p = Pool(5)
         list_of_output_files = p.map(A, splited_input_file[0], splited_input_file[1], splited_input_file[2])
         output_file = concatenate_files(list_of_output_files)

Теперь меня беспокоит то, что выходной файл в A (out.txt) остается тем же, когда многопроцессорная система работает так, как будут различаться list_of_output_files, и я объединяю их в файл как конечный выходной файл. Любое предложение? По сути, в приведенном выше примере файл разделен на 3 файла (splited_input_file []), ожидаются также 3 выходных файла (list_of_output_files), но путь в A такой же (out.txt), и к ним можно получить доступ в параллельных процессах и может испортить или потерять некоторые данные.

1 Ответ

0 голосов
/ 04 июля 2019

Хотите, чтобы конечный выходной файл был в порядке (то есть что-то вроде splited_input_file [0] + splited_input_file 1 + splited_input_file [2])? Если это так, вы можете определить функцию, которая принимает данные, которые вы хотите записать, и имя выходного файла в качестве параметров, а затем запустить многопроцессорную обработку 3 раза с разными именами файлов, чтобы избежать одновременного доступа трех процессов к одному и тому же файлу.

Еще одна вещь, на которую следует обратить внимание, это то, что вы можете использовать threads для меньших накладных расходов, чем многопроцессорная, поскольку это процесс ввода-вывода (чтение и запись файлов), и Python выпускает GIL для них.

...