2017-09-19 26 views
5

मैं एक बड़ी जेएसएसएल फ़ाइल (bzip2 संपीड़ित 17 जीबी) उत्पन्न (और संपीड़ित) उत्पन्न करने के लिए पाइथन bz2 मॉड्यूल का उपयोग कर रहा हूं।क्या बीजी 2 के डिकंप्रेशन को समानांतर करना संभव है?

हालांकि, जब मैं बाद में pbzip2 का उपयोग कर यह केवल विसंपीड़न के लिए एक सीपीयू कोर, जो काफी धीमी है उपयोग करने के लिए लगता है यह संपीड़न हटाने का प्रयास करें।

जब मैं इसे pbzip2 से संपीड़ित करता हूं तो यह डिकंप्रेशन पर एकाधिक कोर का लाभ उठा सकता है। क्या pbzip2-संगत प्रारूप में पायथन के भीतर संपीड़ित करने का कोई तरीका है?

import bz2,sys 
from Queue import Empty 
#... 
compressor = bz2.BZ2Compressor(9) 
f = open(path, 'a') 

    try: 
     while 1: 
      m = queue.get(True, 1*60) 
      f.write(compressor.compress(m+"\n")) 
    except Empty, e: 
     pass 
    except Exception as e: 
     traceback.print_exc() 
    finally: 
     sys.stderr.write("flushing") 
     f.write(compressor.flush()) 
     f.close() 
+0

से मैं क्या डिस्क मैं parallelizing पढ़ा है/ओ एक [बुरा विचार] है (https://stackoverflow.com/a/1993707/3727854)। यह कहा जा रहा है [यह उत्तर प्रासंगिक हो सकता है] (https://stackoverflow.com/a/42012661/3727854) इस प्रश्न के लिए। –

+1

@JamesDraper डिस्क आई/ओ नहीं होगा सीमित कारक हालांकि ... bzip संगणना, धीमी गति से – o11c

+1

नोट @worenga कि jsonl एक खतरनाक स्वरूप है अगर तुम कभी शीर्ष स्तर के नंबरों का उपयोग हो सकता है क्योंकि वे काट-छांट से ग्रस्त हैं। जेसन-सीक एक त्रुटि को अनिवार्य रूप से उस समस्या को हल करता है। – o11c

उत्तर

2

एक pbzip2 स्ट्रीम में एकाधिक bzip2 धाराओं के संयोजन से ज्यादा कुछ नहीं है।

एक उदाहरण खोल का उपयोग करते हुए:

bzip2 </usr/share/dict/words> words_x_1.bz2 
cat words_x_1.bz2{,,,,,,,,,} > words_x_10.bz2 
time bzip2 -d <words_x_10.bz2> /dev/null 
time pbzip2 -d <words_x_10.bz2> /dev/null 

मैं अजगर के bz2 मॉड्यूल उपयोग नहीं किया है, लेकिन यह बंद/'a' ppend मोड में एक धारा को फिर से खोलने के लिए आसान होना चाहिए, हर तो कई बाइट, प्राप्त करने के लिए एक ही परिणाम। ध्यान दें कि यदि BZ2File किसी मौजूदा फ़ाइल-जैसी ऑब्जेक्ट से बनाया गया है, तो BZ2File को बंद करना अंतर्निहित स्ट्रीम को बंद नहीं करेगा (जो आप यहां चाहते हैं)।

मैंने माप नहीं किया है कि कितने बाइट्स चंकिंग के लिए इष्टतम हैं, लेकिन मुझे लगता है कि प्रत्येक 1-20 मेगाबाइट्स - यह निश्चित रूप से bzip2 ब्लॉक आकार (900k) से बड़ा होना चाहिए।

ध्यान दें कि यदि आप प्रत्येक खंड के संपीड़ित और असम्पीडित ऑफसेट रिकॉर्ड करते हैं, तो आप काफी कुशल यादृच्छिक पहुंच कर सकते हैं। इस प्रकार dictzip प्रोग्राम काम करता है, हालांकि यह gzip पर आधारित है।

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