-1

OCR タスクで初めて Spark を使い始めたところです。スキャンしたテキスト ドキュメントを含む PDF ファイルのフォルダーがあり、それをプレーン テキストに変換したいと考えています。最初に、フォルダー内のすべての pdf の並列化されたデータセットを作成し、Map 操作を実行して画像を作成します。このタスクには Wand イメージを使用します。最後に foreach を使用して、Tesseract のラッパーである pytesseract を使用して OCR を実行します。

このアプローチの問題は、新しいドキュメントごとにメモリ使用量が増加し、最終的に「OSはメモリを割り当てられません」というエラーが発生することです。完全な 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を使用しています

4

1 に答える 1

0

アップデート

解決策を見つけました。問題は、次を使用してイメージリストを作成する部分にあるようです。

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)]

        fullPath = "{}tmp/{}/".format(path, documentName)
        images = [(fullPath + f, documentName) for f in os.listdir(fullPath) if f.endswith(".jpg")]

        return natsorted(images, key=lambda y: y[0])

完全に機能しますが、理由はわかりません..すべてが閉じられますが、それでもメモリに残ります

于 2016-03-23T12:32:13.470 に答える