2016-02-01 2 views
6

लक्ष्यएक बड़े पैमाने पर बाइनरी फ़ाइल लगभग आकार 1.3GB में समान मान अजगर

पढ़ना करने के लिए स्ट्रिंग में विशिष्ट अनुक्रमणिका बदल सकते हैं और कुछ बिट्स को बदलने और फिर इसे लिखने वापस एक अलग फाइल करने के लिए (मूल फ़ाइल को संशोधित नहीं कर सकते हैं)।

विधि

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

मेरा एल्गोरिदम पूरी फ़ाइल के माध्यम से लूप करता है और स्ट्रिंग के सभी इंडेक्स को संशोधित करने की आवश्यकता वाले सूची में स्टोर करता है। पकड़ यह है कि स्ट्रिंग में सभी इंडेक्स को उसी मान में संशोधित करने की आवश्यकता है। अपरिवर्तनीय प्रकृति के कारण मैं इसे जगह में नहीं कर सकता। मैं इसे वर्णों की सूची में परिवर्तित नहीं कर सकता क्योंकि यह मेरी स्मृति बाधाओं को उड़ाता है और बहुत समय लगता है। करने के लिए व्यवहार्य चीज इसे एक अलग स्ट्रिंग में स्टोर करना है, लेकिन अपरिवर्तनीय प्रकृति के कारण मुझे स्ट्रिंग ऑब्जेक्ट्स का एक टन बनाना है और उन्हें संयोजित करना है।

मैंने https://waymoot.org/home/python_string/ से कुछ विचारों का उपयोग किया, हालांकि यह मुझे अच्छा प्रदर्शन नहीं देता है। किसी भी विचार, लक्ष्य सूचकांक सूची में मूल्यों द्वारा निर्धारित कुछ प्लेसहोल्डर्स को छोड़कर मौजूदा सुपर लंबी स्ट्रिंग को बिल्कुल दूसरे में कॉपी करना है?

+0

प्रतिस्थापन मूल के समान आकार हैं? इसलिए आप फ़ाइल की स्थिति खोज सकते हैं और डिस्क पर जगह पर लिख सकते हैं। –

+0

आप कहते हैं "इसे वापस लिखना", लेकिन मेरे उत्तर में टिप्पणी में कहा गया है कि "बाधा मूल फ़ाइल को नहीं बदलना है"। यह एक विरोधाभास है। –

+0

प्रश्न संपादित- अस्पष्टता –

उत्तर

5

तो, ईमानदार होने के लिए, आपको अपनी फ़ाइल को स्ट्रिंग में नहीं पढ़ना चाहिए। आपको विशेष रूप से कुछ भी लिखना नहीं चाहिए, लेकिन बाइट्स जो आप वास्तव में बदलते हैं। यह केवल संसाधनों का अपशिष्ट है, क्योंकि आप केवल उन फ़ाइलों को नीचे ध्यान में रखते हुए फ़ाइल के माध्यम से रैखिक रूप से पढ़ रहे हैं, जिन्हें संशोधित करने की आवश्यकता है।

mmap समर्थन के कुछ स्तर के साथ सभी OSes (अर्थात, Unixes लिनक्स, ओएस एक्स, * बीएसडी और अन्य OSes विंडोज की तरह है, उन के बीच में), तो आप सिर्फ पढ़ें/लिखें मोड में फ़ाइल खोलने के लिए Python's mmap मॉड्यूल का उपयोग कर सकते हैं पर , इसे स्कैन करें और इसे जगह में संपादित करें, बिना किसी RAM को इसे पूरी तरह से लोड करने की आवश्यकता के बिना और फिर उसे वापस लिखें। बेवकूफ उदाहरण, कुछ 12-मूल्यवान बाइट्स को किसी स्थिति द्वारा निर्भर करता है-निर्भर:

नोट: यह कोड मेरा है, और एमआईटी लाइसेंस नहीं है। यह टेक्स्ट-एन्हांसमेंट उद्देश्यों के लिए है और इस प्रकार सीसी-बाय-एसए द्वारा कवर किया गया है। इस बेवकूफ कथन को आवश्यक बनाने के लिए धन्यवाद एसई।

import mmap 
with open("infilename", "r") as in_f: 
    in_view = mmap.mmap(in_f.fileno(), 0) ##length = 0: complete file mapping 
    length = in_view.size() 
    with open("outfilename", "w") as out_f 
    out_view = mmap.mmap(out_f.fileno(), length) 
    for i in range(length): 
     if in_view[i] == 12: 
     out_view[i] = in_view[i] + i % 10 
     else: 
     out_view[i] = in_view[i] 
+0

यह एक अच्छा समाधान की तरह लगता है, हालांकि बाधा यह है कि मैं इनपुट फ़ाइल को संशोधित नहीं कर सकता, मुझे इसे एक अलग फ़ाइल प्रारूप में लिखना होगा जो किसी अन्य प्रक्रिया में लिंक होगा। तो स्मृति में इसे बदलना मुझे अच्छा नहीं करेगा। इसके अलावा कुछ इनपुट फाइलें केवल पढ़ी जाती हैं और मुझे उनके पास कोई अन्य सुझाव याद करने की अनुमति भी नहीं है? –

+0

आप अभी भी उन्हें केवल पढ़ने के लिए mmaply कर सकते हैं, और सामग्री को एक दूसरे, लिखित रूप से mmaped फ़ाइल पर प्रतिलिपि बनाएँ। मैं यही करता हूं। –

+0

@johnsmith कि विचार के अनुसार अपडेट –

0

स्ट्रिंग को स्लाइस करने के बारे में क्या, प्रत्येक स्लाइस को संशोधित करें, अगले स्लाइस पर जाने से पहले इसे डिस्क पर वापस लिखें? डिस्क के लिए बहुत गहन?

+0

के लिए खेद है, मैं वास्तव में कोशिश करूँगा, डिस्क पर जा रहा है कि मेरे अंतर्निहित धारणा कार्यक्रम को धीमा कर देगा। लेकिन वास्तविक प्रदर्शन ट्रेडऑफ देखना दिलचस्प हो सकता है। –

+0

आम तौर पर एक उत्तरों में कोड उदाहरण जैसे कुछ और विवरण होते हैं, ... – Trilarion

+0

हां, मैं चर्चा शुरू करने के लिए एक टिप्पणी छोड़ना चाहता था लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है ... – Benares

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