самый быстрый способ многопроцессорной обработки файла из нескольких 10K строк, прочитанного в python3

#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 с) на самом деле нельзя сократить.