并行化包含嵌套函数调用的for循环

时间:2019-04-23 11:59:05

标签: python multithreading parallel-processing multiprocessing joblib

我有一个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()
)

其中一些功能非常复杂,并且包含其他for循环,甚至还有一些嵌套的for循环。

我将joblib设置为使用线程,因为在尝试其他方法时,我不断收到有关突然终止的错误。

  • 随着循环的更多迭代,并行化速度变慢的原因是否存在?
  • 嵌套函数和循环的这种结构是否不适合并行化?
  • 这可能是一些内存瓶颈,而不是并行化问题吗?

0 个答案:

没有答案