Распараллеливание цикла for, который содержит вызовы вложенных функций - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть цикл 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 на использование многопоточности, так как я постоянно получаю сообщение об ошибке при преждевременном завершении работы при попытке выполнить другое.

  • Есть ли какая-то причина, почему это распараллеливание замедляется при добавлении большего количества итераций цикла?
  • Не подходит ли эта структура вложенных функций и циклов для распараллеливания?
  • Может ли это бытьбыть узким местом в памяти, а не проблемой распараллеливания?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...