У меня есть цикл for, который я пытаюсь распараллелить, используя joblib (я также пробовал dask с одинаковыми результатами).Внутри цикла вызывается ряд последовательных функций - некоторые из них вызываются из других функций.
Цикл делает, используя OCR для извлечения текста из многостраничных PDF-файлов.Если PDF - это всего лишь пара страниц (4 - это то, что я тестировал), то, похоже, есть преимущество от распараллеливания цикла.Однако, кажется, что когда файл pdf длиннее (скажем, 15 страниц), он гораздо медленнее, чем без какой-либо параллелизации.
Вот некоторые из моих фрагментов кода:
def _extract_all_label_values(i, page_image_and_contours):
try:
page_label_values = _extract_label_values(page_image_and_contours[0], page_image_and_contours[1])
for element in page_label_values:
element['page'] = i
return page_label_values
except:
return None
def _extract_label_values(image, contours):
offset = 10
close_labels = _get_close_labels(contours, offset)
label_values = _get_label_value(image, contours, close_labels, offset)
label_values = _check_extracted(image, label_values, offset)
return label_values
page_images_and_countours = preprocessor.run(pdf_path)
num_cores = multiprocessing.cpu_count()
parallel_function = Parallel(n_jobs=num_cores, prefer='threads')
elements = parallel_function(
delayed(_extract_all_label_values)(i, page_image_and_countours)
for i, page_image_and_countours in page_images_and_countours.items()
)
Некоторые изэти функции довольно сложны и содержат другие для циклов, и даже некоторые для вложенных циклов.
Я настроил joblib на использование многопоточности, так как я постоянно получаю сообщение об ошибке при преждевременном завершении работы при попытке выполнить другое.
- Есть ли какая-то причина, почему это распараллеливание замедляется при добавлении большего количества итераций цикла?
- Не подходит ли эта структура вложенных функций и циклов для распараллеливания?
- Может ли это бытьбыть узким местом в памяти, а не проблемой распараллеливания?