2017-01-19 2 views
0

У меня есть несколько сотен входных файлов, которые мне нужно передать функции для вычисления некоторых чисел и записать их в выходной файл. Функция не возвращает никакого значения. Таким образом, каждый вызов функции является независимым.Многопоточная/параллельная обработка

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

import multiprocessing as mp 
NumProcess = 4 

def Analysis(InputFile): 
    #do some calcs 
    #Write results to output file 
    #return nothing 

FileList = ['InputFile1.csv','InputFile2.csv','InputFile3.csv',....] 
pool = mp.Pool(processes=NumProcess) 
temp = [pool.apply_async(Analysis, args=(File) for File in FileList] 
output = [p.get() for p in temp] 
pool.close() 
+0

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

+0

В этом листинге слишком много записей о начале записи, хотя – jsbueno

+0

Связан ли ваш алгоритм с привязкой к процессору или привязкой ввода/вывода? Если он связан с I/O, то создание нескольких потоков/процессов не ускорит его работу и может сделать его медленнее, если он заставит головы вашего жесткого диска искать назад и вперед намного больше, чем в одиночном режиме, thread/single-process case. –

ответ

0

Выполняется ли звонок по взаимному соединению? В этой строке есть ошибка, так как вы не передаете аргумент File как кортеж вообще.

Исправленная версия (обратите внимание на Запятую для обеспечения арг является кортежем):

temp = [pool.apply_async(Analysis, args=(File,)) for File in FileList] 
+0

Да, это работает. Извините, пропустил конечную запятую и скобку, когда я редактировал сообщение. Поскольку вызовы функций независимы, я думал, что должен быть более эффективный способ параллельного обработки файлов. – user7443538

+0

Существует более простой способ - но он не эффективнее. В Python 3 yu могут использовать concurrent.futures.ProcessPoolExecutor, но если это не ускорит вас, значит, не будет conucurrent.futures. – jsbueno

+0

Есть ли у вас какие-либо предложения о том, как я могу перебрать все входные файлы таким образом, чтобы каждый из доступных процессоров мог запускать один из входных файлов параллельно? Например - Processor1 - Analysis (InputFile1); Processor2 - Analysis (InputFile2), .... – user7443538

Смежные вопросы