Почему этот скрипт python занимает все мое дисковое пространство? - PullRequest
1 голос
/ 22 января 2020

Я использую скрипт python, который вы можете увидеть ниже для справки. Этот скрипт использует pytesseract для преобразования текста в изображении, полученном из файла pdf, в json файл, содержащий текст в виде строки вместе с номером страницы et c. Но каждый раз, когда я запускаю этот сценарий, через некоторое время в моем дисковом хранилище не остается свободного места, и оно освобождается только после перезагрузки компьютера. Чтобы привести пример, на моем компьютере осталось 20 ГБ, но на данный момент, после запуска сценария в течение некоторого времени, диск переполняется, я понятия не имею, почему это происходит. Я пытался использовать 'del' для освобождения места, если его используют локальные переменные, а также g c .collect () для принудительного освобождения этого пространства, но ничего не работает. Что я делаю не так и как я могу это улучшить?

import io
from PIL import Image
import pytesseract
from wand.image import Image as wi
import gc
import json
import uuid
import gc

def generate_id(code):
    increment_no = str(uuid.uuid4().int)[5:12]
    _id = code + increment_no
    return _id

def pdf_to_json(pdf_path):
    """This function takes in the path of pdf to generate a json object with the following attributes"""
    """Company (Name of company), id (Unique Id), Page_*No. (Example Page_1, Page_2 etc.) with each page containing text in that speicifc pdf page"""
    data = {}
    pdf=wi(filename=pdf_path,resolution=300)
    data['company'] = str(pdf_path.split('/')[-1:][0])
    countrycode = str(pdf_path.split('/')[-2:-1][0].split('_')[0:1][0])
    data['id'] = generate_id(countrycode)
    pdfImg=pdf.convert('jpeg')
    del pdf
    gc.collect()
    imgBlobs=[]
    for img in pdfImg.sequence:
        page=wi(image=img)
        gc.collect()
        imgBlobs.append(page.make_blob('jpeg'))
        del page
        gc.collect()
    del pdfImg
    gc.collect()
    i=1
    Pages = []
    for imgBlob in imgBlobs:
        im=Image.open(io.BytesIO(imgBlob))
        text=pytesseract.image_to_string(im,lang='eng')
        Pages.append(text)
        del text
        gc.collect()
        im.close()
        del im
        gc.collect()
    del imgBlobs
    gc.collect()
    data['Pages'] = Pages
    with open('/Users/rishabh/Desktop/CyberBoxer/hawaii_pdf/'+data['id']+'.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)
    del data
    gc.collect()
    del Pages
    gc.collect()

from os import listdir
onlyfiles = [f for f in listdir('/Users/rishabh/Desktop/CyberBoxer/iowa_pdf/')]

j=1
for i in onlyfiles:
    if '.pdf' in i:
        start = time.time()
        pdf_path = '/Users/rishabh/Desktop/CyberBoxer/iowa_pdf/'+i
        pdf_to_json(pdf_path)
        print(j)
        j+=1
        end = time.time()
        print(end-start)
        gc.collect()```

1 Ответ

0 голосов
/ 22 января 2020

Я понял, почему это происходит, потому что из-за модуля wand Image в python мне пришлось уничтожить полученные объекты, которые с помощью 'del' или g c .collect () не произойдут, так как изображение палочки имеет свой собственный метод уничтожения.

Вот обновленная функция для того же самого:

    """This function takes in the path of pdf to generate a json object with the following attributes"""
    """Company (Name of company), id (Unique Id), Page_*No. (Example Page_1, Page_2 etc.) with each page containing text in that speicifc pdf page"""
    data = {}
    #pdf=wi(filename=pdf_path,resolution=300)
    data['company'] = str(pdf_path.split('/')[-1:][0])
    countrycode = str(pdf_path.split('/')[-2:-1][0].split('_')[0:1][0])
    data['id'] = generate_id(countrycode)
    #pdfImg=pdf.convert('jpeg')
    #del pdf
    #gc.collect()
    #imgBlobs=[]
    #for img in pdfImg.sequence:
    #    page=wi(image=img)
    #    gc.collect()
    #    imgBlobs.append(page.make_blob('jpeg'))
    #    del page
    #    gc.collect()    
    req_image = []
    with WI(filename=pdf_path, resolution=150) as image_jpeg:
        image_jpeg.compression_quality = 99
        image_jpeg = image_jpeg.convert('jpeg')

        for img in image_jpeg.sequence:
            with WI(image=img) as img_page:
                req_image.append(img_page.make_blob('jpeg'))
    image_jpeg.destroy()
    i=1
    Pages = []
    for imgBlob in req_image:
        im=Image.open(io.BytesIO(imgBlob))
        text=pytesseract.image_to_string(im,lang='eng')
        Pages.append(text)
        im.close()
        del im
    data['Pages'] = Pages
    with open('/Users/rishabh/Desktop/CyberBoxer/iowa_pdf/'+data['id']+'.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)```
...