У меня есть функция, которая берет список изображений и производит вывод в виде списка после применения OCR к изображению.У меня есть другая функция, которая управляет вводом этой функции, используя многопроцессорность.Итак, когда у меня есть один список (то есть нет многопроцессорной обработки), каждое изображение списка заняло ~ 1 с, но когда я увеличил списки, которые должны были обрабатываться параллельно, до 4, каждое изображение заняло поразительные 13 с.
Чтобы понять, где на самом деле проблема, я попытался создать минимальный рабочий пример проблемы.Здесь у меня есть две функции eat25
и eat100
, которые открывают изображение name
и передают его в OCR, который использует API pytesseract
.eat25
делает это 25 раз, а eat100
делает это 100 раз.
Моя цель здесь - запустить eat100
без многопроцессорной обработки и eat25
с многопроцессорной обработкой (с 4 процессами).Теоретически, это должно занять в 4 раза меньше времени, чем eat100
, если у меня 4 отдельных процессора (у меня 2 ядра с 2 потоками на ядро, поэтому CPU (s) = 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
можно найти здесь .Я был бы рад, если бы люди воспроизвели код и проверили, сохраняется ли проблема.