में एक बड़ी फ़ाइल को संशोधित करना मैं स्कैला में एक बड़ी पोस्टस्क्रिप्ट फ़ाइल को संशोधित करने की कोशिश कर रहा हूं (कुछ आकार में 1 जीबी जितना बड़ा है)। फ़ाइल, बैच का एक समूह है एक कोड है कि बैच नंबर, पृष्ठों की संख्या का प्रतिनिधित्व करता है, आदिस्कैला
मैं जरूरत से युक्त प्रत्येक बैच के साथ करने के लिए:
- बैच कोड के लिए फ़ाइल खोजें (हमेशा जो फ़ाइल में एक ही पंक्ति के साथ शुरू करें)
- अगले बैच कोड
- प्रत्येक बैच में कितने पेज हैं, शामिल करने के लिए बैच कोड संशोधित करें तक पृष्ठों की संख्या की गणना करें।
- नई फ़ाइल को किसी अन्य स्थान पर सहेजें।
मेरे वर्तमान समाधान दो iterators (iterA
और iterB
), Source.fromFile("file.ps").getLines
से बनाए उपयोग करता है। पहला इटरेटर (iterA
) बैच कोड की शुरुआत में थोड़ी देर के लूप में ट्रैवर्स (iterB.next
प्रत्येक बार भी कहा जाता है)। iterB
फिर अगले बैच कोड (या फ़ाइल का अंत) तक खोज जारी रखता है, जो इसे गुजरने वाले पृष्ठों की संख्या को गिनता है। फिर, यह iterA
की स्थिति पर बैच कोड अपडेट करता है, प्रक्रिया दोहराती है।
यह बहुत गैर-स्कैला जैसा लगता है और मैंने अभी भी इन परिवर्तनों को एक नई फ़ाइल में सहेजने के लिए एक अच्छा तरीका नहीं बनाया है।
इस समस्या का अच्छा दृष्टिकोण क्या है? क्या मुझे पूरी तरह से इटरेटर को कुचलना चाहिए? मैं अधिमानतः एक ही समय में पूरे इनपुट या आउटपुट में स्मृति के बिना ऐसा करना पसंद करूंगा।
धन्यवाद!
मेरा अनुमान है कि यह समाधान पूरी फ़ाइल को स्मृति में रखेगा क्योंकि 2.9.x इस पैटर्न 'Source.fromFile ("में।पीएस ")। getLines.toStream' स्ट्रीम के सिर पर है। http://stackoverflow.com/a/8640680/257449 और https://issues.scala-lang.org/browse/SI-4835 देखें। – huynhjl
huynhjl, मैंने आपके द्वारा पाई गई (परेशान) बग को ठीक करने के लिए कोड नमूना अपडेट किया है। धन्यवाद। – stephenjudkins