मानक open()
function पहले से ही डिफ़ॉल्ट रूप से, एक बफर्ड फ़ाइल (यदि आपके प्लेटफ़ॉर्म पर उपलब्ध हो) लौटाता है। फ़ाइल ऑब्जेक्ट्स के लिए आमतौर पर पूरी तरह से buffered है।
आमतौर पर का अर्थ है कि पायथन इसे सी stdlib कार्यान्वयन के लिए छोड़ देता है; यह UTF-16 फ़ाइल नामों का समर्थन करने के लिए Windows पर fopen()
call (wfopen()
) का उपयोग करता है, जिसका अर्थ है कि फ़ाइल के लिए डिफ़ॉल्ट बफरिंग चुना जाता है; लिनक्स पर मेरा मानना है कि 8kb होगा। एक्सएमएल जैसे शुद्ध-पढ़ने वाले ऑपरेशन के लिए इस प्रकार के बफरिंग को बिल्कुल जो आप चाहते हैं।
iterparse
द्वारा किए गए एक्सएमएल पार्सिंग फ़ाइल को 16384 बाइट्स (16 केबी) के टुकड़ों में पढ़ता है।
open('foo.xml', buffering=(2<<16) + 8) # buffer enough for 8 full parser reads
जो डिफ़ॉल्ट बफर आकार (जो मैं फ़ाइल ब्लॉक आकार या एक से अधिक उसके मैच के लिए उम्मीद थी) को पार कर जाएगी:
आप buffersize नियंत्रित करने के लिए चाहते हैं, buffering
कीवर्ड तर्क का उपयोग करें। this article के अनुसार पढ़ने वाले बफर को सहायता में वृद्धि करना चाहिए, और आकार का उपयोग करके कम से कम 4 बार अपेक्षित पढ़ने वाले ब्लॉक आकार प्लस 8 बाइट्स पढ़ने के प्रदर्शन में सुधार करने जा रहे हैं। उपरोक्त उदाहरण में मैंने इसे ElementTree पढ़ने के आकार के 8 बार सेट कर दिया है।
io.open()
function ऑब्जेक्ट्स की नई पायथन 3 आई/ओ संरचना का प्रतिनिधित्व करता है, जहां I/O को आपको अधिक लचीलापन देने के लिए कक्षा प्रकारों के एक नए पदानुक्रम में विभाजित किया गया है। कीमत अधिक संकेत है, डेटा के लिए यात्रा करने के लिए अधिक परतें हैं, और पाइथन सी कोड ओएस को छोड़ने के बजाए और अधिक काम करता है।
आप देख सकते हैं और देख सकते हैं कि io.open('foo.xml', 'rb', buffering=2<<16)
कोई बेहतर प्रदर्शन करने जा रहा है या नहीं। rb
मोड में खुलने से आपको io.BufferedReader
instance मिल जाएगा।
आप io.TextIOWrapper
का उपयोग करना चाहते हैं; अंतर्निहित एक्सपैट पार्सर कच्चे डेटा चाहता है क्योंकि यह आपके एक्सएमएल फ़ाइल एन्कोडिंग को डीकोड करेगा। यह केवल अतिरिक्त ओवरहेड जोड़ देगा; यदि आप r
(टेक्स्टमोड) में इसके बजाय खोलते हैं तो आपको यह प्रकार मिलता है।
io.open()
का उपयोग करके आप अधिक लचीलापन और एक अमीर एपीआई दे सकता है, लेकिन अंतर्निहित सी फ़ाइल वस्तु open()
बजाय fopen()
, का उपयोग कर खोला जाता है और सभी बफरिंग अजगर io.BufferedIOBase
कार्यान्वयन द्वारा नियंत्रित किया जाता।
आपकी समस्या इस जानवर को संसाधित करेगी, फाइल नहीं पढ़ती, मुझे लगता है। एक 800 जीबी फ़ाइल पढ़ने के दौरान डिस्क कैश वैसे भी काफी शॉट होगा।
800 जीबी पाठ फ़ाइल ?! भगवान की मां ... आप किस बिंदु पर कहना चाहते हैं कि डेटाबेस में चकना अच्छा विचार है? – Makoto
@Makoto, बदतर शीर्षक पाठ कहते हैं, लेकिन शरीर यह _XML_ –
मैं सिर्फ तुम्हारे लिए आशा है कि फ़ाइल वास्तव में मान्य XML है कहते हैं ... – poke