5

मेरे पास 110 पीडीएफ हैं जो मैं छवियों को निकालने की कोशिश कर रहा हूं। एक बार छवियों को निकालने के बाद, मैं किसी भी डुप्लिकेट को हटाना और 4KB से कम छवियों को हटाना चाहता हूं। ऐसा करने के लिए मेरे कोड इस तरह दिखता है:पायथन में मल्टीप्रोसेसिंग मॉड्यूल का सही तरीके से उपयोग कैसे करें?

def extract_images_from_file(pdf_file): 
    file_name = os.path.splitext(os.path.basename(pdf_file))[0] 
    call(["pdfimages", "-png", pdf_file, file_name]) 
    os.remove(pdf_file) 

def dedup_images(): 
    os.mkdir("unique_images") 
    md5_library = [] 
    images = glob("*.png") 
    print "Deleting images smaller than 4KB and generating the MD5 hash values for all other images..." 
    for image in images: 
     if os.path.getsize(image) <= 4000: 
      os.remove(image) 
     else: 
      m = md5.new() 
      image_data = list(Image.open(image).getdata()) 
      image_string = "".join(["".join([str(tpl[0]), str(tpl[1]), str(tpl[2])]) for tpl in image_data]) 
      m.update(image_string) 
      md5_library.append([image, m.digest()]) 
    headers = ['image_file', 'md5'] 
    dat = pd.DataFrame(md5_library, columns=headers).sort(['md5']) 
    dat.drop_duplicates(subset="md5", inplace=True) 

    print "Extracting the unique images." 
    unique_images = dat.image_file.tolist() 
    for image in unique_images: 
     old_file = image 
     new_file = "unique_images\\" + image 
     shutil.copy(old_file, new_file) 

इस प्रक्रिया में कुछ समय लग सकता है, तो मैं बहु सूत्रण में भिगोना शुरू कर दिया है। यह समझने के लिए स्वतंत्र महसूस करें कि जैसा कि मुझे कह रहा है कि मुझे नहीं पता कि मैं क्या कर रहा हूं। मैंने सोचा था कि छवियों को निकालने के संबंध में प्रक्रिया आसानी से समानांतर होगी, लेकिन एक फ़ाइल के साथ बहुत से I/O चलने के बाद से deduping नहीं है और मुझे नहीं पता कि यह कैसे करना है। तो यहाँ समानांतर प्रक्रिया में मेरी प्रयास है:

if __name__ == '__main__': 
    filepath = sys.argv[1] 
    folder_name = os.getcwd() + "\\all_images\\" 
    if not os.path.exists(folder_name): 
     os.mkdir(folder_name) 
    pdfs = glob("*.pdf") 
    print "Copying all PDFs to the images folder..." 
    for pdf in pdfs: 
     shutil.copy(pdf, ".\\all_images\\") 
    os.chdir("all_images") 
    pool = Pool(processes=8) 
    print "Extracting images from PDFs..." 
    pool.map(extract_images_from_file, pdfs) 
    print "Extracting unique images into a new folder..." 
    dedup_images() 
    print "All images have been extracted and deduped." 

सब कुछ ठीक काम किया है करने के लिए जब छवियों को निकालने लगता है, लेकिन फिर यह सब बिगड़ गया था। तो यहां मेरे प्रश्न हैं:

1) क्या मैं समांतर प्रक्रिया को सही तरीके से स्थापित कर रहा हूं?
2) क्या यह dedup_images() पर सभी 8 प्रोसेसर का उपयोग करने का प्रयास जारी रखता है?
3) क्या कोई ऐसी चीज है जिसे मैं याद कर रहा हूं और/या सही तरीके से नहीं कर रहा हूं?

अग्रिम धन्यवाद!

संपादित यहाँ है कि मैं क्या "बिगड़" मतलब है। त्रुटियों इस तरह लाइनों का एक समूह के साथ शुरू:

I/O Error: Couldn't open image If/iOl eE r'rSourb:p oICe/onOua l EdNrner'wot r Y:oo prCekon u Cliodmunan'gttey of1pi0e 
l2ne1 1i'4mS auogbiepl o2fefinrlaee e [email protected]'egSwmu abYipolor ekcn oaCm o Nupentwt y1Y -o18r16k11 8.C1po4nu gn3't4 
y7 5160120821143 3p4t7I 9/49O-8 88E78r81r.3op rnp:gt ' C 
3o-u3l6d0n.'ptn go'p 
en image file 'Ia/ ON eEwr rYoorr:k CCIoo/uuOln dtEnyr' rt1o 0ro2:p1 e1Cn4o uiolmidalng2'eft r m ' 
ai gpceoo emfn iapl teN e1'w-S 8uY6bo2pr.okpe nnCgao' u 
Nnetwy Y1o0r2k8 1C4o u3n4t7y9 918181881134 3p4t7 536-1306211.3p npgt' 
4-879.png' 
I/O Error: CoulId/nO' tE rorpoern: iCmoaugled nf'itl eo p'eub piomeangae fNielwe Y'oSrukb pCooeunnat yN e1w0 2Y8o1r 
4k 3C4o7u9n9t8y8 811032 1p1t4 3o-i3l622f pt 1-863.png' 

और फिर इस तरह कई पंक्तियों के साथ अधिक पठनीय हो जाता है:

I/O Error: Couldn't open image file 'pt 1-864.png' 
I/O Error: Couldn't open image file 'pt 1-865.png' 
I/O Error: Couldn't open image file 'pt 1-866.png' 
I/O Error: Couldn't open image file 'pt 1-867.png' 

यह थोड़ी देर के लिए दोहराता है, विकृत बीच आगे और पीछे जा रहा त्रुटि पाठ और पठनीय।

अंत में, यह यहां के लिए हो जाता है:

Deleting images smaller than 4KB and generating the MD5 hash values for all other images... 
Extracting unique images into a new folder... 

जिसका मतलब है कि कोड वापस ऊपर उठाता है और प्रक्रिया के साथ पर जारी है। क्या गलत हो सकता है?

+1

यह मेरे लिए ठीक दिखता है। क्या आप "गड़बड़ी" के बारे में अधिक विशिष्ट हो सकते हैं? – strubbly

+0

@strubbly मैंने ऊपर त्रुटि आउटपुट जोड़ा है। – brittenb

+0

"मैंने मल्टीथ्रेडिंग में डबना शुरू कर दिया है। यह समझने के लिए स्वतंत्र महसूस करें कि मुझे यह नहीं पता कि मुझे क्या पता है कि मैं क्या कर रहा हूं" आप और हर कोई जो समरूपता के साथ काम करना शुरू कर देता है। –

उत्तर

3

आपका कोड मूल रूप से ठीक है।

अस्पष्ट पाठ के सभी I/O Error संदेश कंसोल के लिए interleaved के विभिन्न संस्करणों लिखने की कोशिश कर प्रक्रियाओं है। त्रुटि संदेश pdfimages कमांड द्वारा उत्पन्न किया जा रहा है, संभवतः क्योंकि जब आप एक बार में दो बार दौड़ते हैं, तो संभवतः अस्थायी फ़ाइलों पर, या दोनों एक ही फ़ाइल नाम या उस तरह का उपयोग करते हैं।

प्रत्येक अलग pdf फ़ाइल के लिए एक अलग छवि जड़ का उपयोग करें।

+0

मैंने इसे उत्तर के रूप में स्वीकार कर लिया है क्योंकि यह मेरे द्वारा किए गए मुद्दे को प्रभावी ढंग से हल करता है। मैंने रूट नाम पर एक यादृच्छिक 3-अंकीय अल्फान्यूमेरिक कोड जोड़ा और यह किसी भी मुद्दे को पूरी तरह से कम करता है। धन्यवाद! – brittenb

+0

कूल - आप मल्टीप्रोसेसिंग के साथ ठीक कर रहे हैं - बस ध्यान रखें कि जिन चीजों को आप कॉल करते हैं उन्हें एक साथ चलाने में सक्षम होना चाहिए। जब वे निर्देशिका या फ़ाइलों जैसे संसाधन साझा करते हैं तो वे संघर्ष कर सकते हैं। – strubbly

3
  1. हां, पूल.मैप एक फ़ंक्शन लेते हुए एक फ़ंक्शन लेता है, और फिर एक सूची, जिसमें से प्रत्येक तत्व पहले फ़ंक्शन के लिए तर्क के रूप में पारित होता है।
  2. नहीं है, सब कुछ आप यहाँ लिखा है extract_images_from_file() के शरीर को छोड़कर मूल प्रक्रिया में चलता है। इसके अलावा, मुझे लगता है कि आप 8 प्रक्रियाओं, नहीं प्रोसेसर उपयोग कर रहे हैं का कहना है जाएगा। यदि आपके पास 8-कोर इंटेल CPU है, तो हाइपरथ्रेडिंग सक्षम होने के साथ आप एक साथ 16 प्रक्रियाओं को चलाने में सक्षम होंगे।
  3. यह मेरे लिए ठीक, सिवाय इसके कि लग रहा है, तो extract_images_from_file() एक अपवाद फेंकता है, यह आप क्या चाहते हैं अपने पूरे Pool, जो शायद नहीं है nuke होगा। इसे रोकने के लिए, आप उस ब्लॉक के चारों ओर आज़मा सकते हैं।

"हैयरवायर" की प्रकृति क्या है जिसके साथ आप काम कर रहे हैं? हम अपवाद पाठ देख सकते हैं?

+0

मैंने प्रश्न में त्रुटि आउटपुट जोड़ा है। – brittenb

संबंधित मुद्दे