#python-3.x #multiprocessing #python-multiprocessing
#python-3.x #многопроцессорность #python-многопроцессорность
Вопрос:
Я пытаюсь многопроцессорнопроцессорное чтение нескольких (350 в данном случае) GZ-файлов по 10 тыс. строк каждый в скрипте python3 для дальнейшего сравнения их с другими файлами.
Я извлекаю список файлов из другого «индексного» файла:
###read index file
with open( index_file, "r" ) as fi :
i_linee = fi.read().splitlines()
files_list = [ os.path.join( dirname, l.split(",")[0]) for l in i_linee ]
Ранее я создал функцию для чтения файла и возврата результата:
def readlines_file(single_file) :
with gzip.open( single_file, 'rb' ) as pf :
linee = pf.read().decode("utf-8").splitlines()
linee = [ ll.split("t") for ll in linee ]
return linee
и затем я пытаюсь передать его в мультипроцесс, мне нужно объединить все строки в один объект, я думаю, что мне следует использовать пул для такого рода работы:
with multiprocessing.Pool(processes=3) as pool:
results = pool.map_async(readlines_file, files_list)
Время выполнения ВСЕГО МНОГОПРОЦЕССОРНОГО процесса 5.6654 секунды
если я сравниваю это с той же функцией без использования многопроцессорной обработки, она оказывается медленнее!
###NOT MULTIPROCESSING:
pz_lines = []
for f in files_list :
pz_lines.extend(readlines_file(f))
ОБЩЕЕ время выполнения 3,9624 секунды
поэтому мне интересно, не понимаю ли я чего-то неправильно или вы предполагаете, что это фактически самый быстрый способ сделать это? Подойдет ли карта или что-то еще лучше? PS как я могу затем извлечь строки из результатов, чтобы объединить их?
Заранее большое спасибо за любую помощь!
Комментарии:
1. К сожалению, вы не можете по-настоящему воспользоваться преимуществами многопроцессорности здесь, поскольку то, что, вероятно, замедляет вас, — это доступ к диску. Многопроцессорная обработка сопряжена с накладными расходами, вот почему второй способ выполняется быстрее.
2. не могли бы вы предложить объединить все вложенные файлы в один большой файл, а затем выполнить своего рода многопроцессорное чтение поверх него?
3. Нет, я полагаю, что самый быстрый способ прочитать все ваши файлы — это, вероятно, прочитать их с помощью последовательного кода, поскольку чтение диска в любом случае будет последовательным. С другой стороны, пока ваш файл загружен в память, вы, вероятно, сможете оптимизировать вычисления, которые вы выполняете над ними позже. Возможно, я что-то упускаю, но я действительно думаю, что указанное вами здесь время выполнения (~ 4 с) на самом деле нельзя сократить.