मेरे पास पीडीएफ फाइलों के अंदर के डेटा को पढ़कर .pdf फाइलों को खोजने के लिए एक कोड है। मेरा समाधान मुझे सही फाइलें देता है, लेकिन यह धीमा है। क्या इसे तेज करने का कोई तरीका है?

keyword = keyword.lower()

for subdir, dirs, files in os.walk(folder_path):
    for file in files:
        filepath = subdir + os.sep + file
        fpath = subdir + os.sep
        if(keyword in file.lower()):
            if filepath not in tflist:
                tflist.append(os.path.join(filepath))
        if filepath.endswith(".pdf"):
            if filepath not in tflist:
                with open(os.path.join(fpath,file), "rb") as f:
                    reader = PyPDF2.PdfFileReader(f)
                    for i in range(reader.getNumPages()):
                        page = reader.getPage(i)
                        page_content = page.extractText().lower()
                        if(keyword in page_content):
                            tflist.append(os.path.join(filepath))
                            break
                            #print (str(1+reader.getPageNumber(page)))
                            #print(keyword)

print(tflist)
0
Thilina Bandara 15 जुलाई 2019, 06:46

1 उत्तर

सबसे बढ़िया उत्तर

आप क्या कर सकते हैं multiprocessing.Pool का उपयोग करें।

अपने कोड को दो भागों में विभाजित करें। पहला टुकड़ा os.walk का उपयोग करके पथों की एक सूची तैयार करता है। इसे list_of_filenames कहते हैं।

दूसरा भाग एक फ़ंक्शन है जो फ़ाइल को पढ़ता है और आपके मानदंड के आधार पर प्रत्येक पृष्ठ के लिए फ़ाइल नाम और True या False लौटाता है:

def worker(path):
    rv = {}
    with open(path, "rb") as f:             
        reader = PyPDF2.PdfFileReader(f)       
        for i in range(reader.getNumPages()):
            page = reader.getPage(i)
            page_content = page.extractText().lower()
            if(keyword in page_content):
                 rv[i] = True
            else:
                 rv[i] = False
    return (path, rv)

इसे इस तरह इस्तेमाल करें:

 import multiprocessing as mp

 p = mp.Pool()
 for path, rv in p.imap_unordered(worker, list_of_filenames):
     print('File:', path)
     print('Results:', rv)

यह देखते हुए कि आपके CPU में n कोर हैं, यह एक बार में केवल एक फ़ाइल को संसाधित करने की तुलना में लगभग n गुना तेज चलेगा।

1
Roland Smith 2 अगस्त 2019, 13:09