【发布时间】:2019-04-27 08:24:42
【问题描述】:
我有一个函数,它接收图像列表并在将 OCR 应用于图像后在列表中生成输出。我有另一个函数通过使用多处理来控制该函数的输入。因此,当我有一个列表(即没有多重处理)时,列表中的每个图像花费了大约 1 秒,但是当我将必须并行处理的列表增加到 4 个时,每个图像花费了惊人的 13 秒。
为了了解问题的真正所在,我尝试创建一个最小的问题工作示例。在这里,我有两个函数eat25 和eat100,它们打开图像name 并将其提供给使用API pytesseract 的OCR。 eat25 执行 25 次,eat100 执行 100 次。
我的目标是在没有多处理的情况下运行 eat100,并在多处理的情况下运行 eat25(有 4 个进程)。从理论上讲,如果我有 4 个独立的处理器(我有 2 个内核,每个内核有 2 个线程,因此 CPU(s) = 4(如果我在这里错了,请纠正我),这应该比 eat100 少 4 倍的时间。
但是当我看到代码在打印“处理 0”4 次后甚至没有响应时,所有理论都被浪费了。单处理器函数eat100 工作正常。
我测试了一个简单的范围立方函数,它在多处理中运行良好,所以我的处理器肯定运行良好。这里唯一的罪魁祸首可能是:
-
pytesseract:见this - 代码错误?我做的不对。
`
from pathos.multiprocessing import ProcessingPool
from time import time
from PIL import Image
import pytesseract as pt
def eat25(name):
for i in range(25):
print('Processing :'+str(i))
pt.image_to_string(Image.open(name),lang='hin+eng',config='--psm 6')
def eat100(name):
for i in range(100):
print('Processing :'+str(i))
pt.image_to_string(Image.open(name),lang='hin+eng',config='--psm 6')
st = time()
eat100('normalBox.tiff')
en = time()
print('Direct :'+str(en-st))
#Using pathos
def caller():
pool = ProcessingPool()
pool.map(eat25,['normalBox.tiff','normalBox.tiff','normalBox.tiff','normalBox.tiff'])
if (__name__=='__main__'):
caller()
en2 = time()
print('Pathos :'+str(en2-en))
那么,问题到底出在哪里?任何帮助表示赞赏!
编辑:
图片normalBox.tiff 可以找到here。如果人们重现代码并检查问题是否仍然存在,我会很高兴。
【问题讨论】:
-
我注意到您正在使用
pathos.multiprocessing模块。为什么不使用标准 concurrent.futures 包中的原生ProcessPoolExecutor?
标签: python multiprocessing tesseract pathos python-tesseract