我刚开始第一次使用 Spark 执行 OCR 任务,我有一个包含扫描文本文档的 PDF 文件文件夹,我想将其转换为纯文本。我首先创建文件夹中所有 pdf 的并行数据集,然后执行 Map 操作来创建图像。我使用 Wand 图像来完成这项任务。最后,我使用 foreach 使用 pytesseract 进行 OCR,它是 Tesseract 的包装器。
这种方法的问题是内存使用量随着每个新文档的增加而增加,最后我得到一个错误“操作系统无法分配内存”。我感觉它将完整的 Img 对象存储在内存中,但我需要的只是临时文件位置的列表。如果我用几个 PDF 文件运行它,它可以工作,但超过 5 个文件系统崩溃......
def toImage(f):
documentName = f[:-4]
def imageList(imgObject):
#get list of generated images
imagePrefix = "{}tmp/{}/{}".format(path,documentName,documentName)
if len(img.sequence) > 1:
images = [ ("{}-{}.jpg".format(imagePrefix, x.index), documentName) for x in img.sequence]
else:
images = [("{}.jpg".format(imagePrefix), documentName)]
return images
#store images for each file in tmp directory
with WandImage(filename=path + f, resolution=300) as img:
#create tmp directory
if not os.path.exists(path + "tmp/" + documentName):
os.makedirs(path + "tmp/" + documentName)
#save images in tmp directory
img.format = 'jpeg'
img.save(filename=path + "tmp/" + documentName + '/' + documentName + '.jpg')
imageL = imageList(img)
return imageL
def doOcr(imageList):
print(imageList[0][1])
content = "\n\n***NEWPAGE***\n\n".join([pytesseract.image_to_string(Image.open(fullPath), lang='nld') for fullPath, documentName in imageList])
with open(path + "/txt/" + imageList[0][1] + ".txt", "w") as text_file:
text_file.write(content)
sc = SparkContext(appName="OCR")
pdfFiles = sc.parallelize([f for f in os.listdir(sys.argv[1]) if f.endswith(".pdf")])
text = pdfFiles.map(toImage).foreach(doOCr)
我正在使用具有 8gb 内存 Java 7 和 Python3.5 的 Ubuntu