2009-09-16 10 views
6

बशर्ते कि हम जानते हैं कि सभी फाइल मेमोरी में लोड हो जाएंगी और हम इसे बर्दाश्त कर सकते हैं, एक पाइथन में पूरी फ़ाइल (संभवतः एक बाइनरी फ़ाइल) लोड करने की क्या कमीएं (यदि कोई हैं) या सीमाएं (यदि कोई हैं) चर। यदि यह तकनीकी रूप से संभव है, तो इसे टालना चाहिए, और क्यों?क्या हम एक पूरी फाइल को पकड़ने के लिए एक पायथन चर का उपयोग कर सकते हैं?

फ़ाइल आकार की चिंताओं के संबंध में, इस समाधान को अधिकतम आकार तक सीमित किया जाना चाहिए? और क्यों ?

वास्तविक लोडिंग कोड this stackoverflow entry में प्रस्तावित किया जा सकता है।

नमूना कोड है:

def file_get_contents(filename): 
    with open(filename) as f: 
     return f.read() 

content = file_get_contents('/bin/kill') 

... code manipulating 'content' ... 

[संपादित करें] कोड हेरफेर जो मन में आता है (लेकिन शायद लागू नहीं है) मानक सूची/तार ऑपरेटरों (वर्ग कोष्ठक, '+' के संकेत) या किसी स्ट्रिंग है ऑपरेटर ('लेन', 'ऑपरेटर', 'गिनती', 'endwith'/'startwith', 'split', 'translation' ...)।

उत्तर

6

जबकि आपको अच्छी प्रतिक्रिया मिली है, ऐसा लगता है कि किसी ने आपके प्रश्न के इस हिस्से का उत्तर नहीं दिया है (जैसा कि अक्सर होता है जब आप किसी प्रश्न में कई प्रश्न पूछते हैं; -) ...:

के बारे में फ़ाइल आकार चिंताओं, क्या अधिकतम आकार इस समाधान सीमित किया जाना चाहिए करने के लिए?। और क्यों ?

सबसे महत्वपूर्ण बात यह है, कितना शारीरिक रैम कर सकते हैं इस विशिष्ट अजगर प्रक्रिया वास्तव में उपयोग, अनावश्यक रूप से समग्र प्रणाली के प्रदर्शन के अन्य पहलुओं को दंडित बिना (क्या के रूप में एक "काम सेट" में जाना जाता है)। यदि आप अपने "कामकाजी सेट" के लिए भौतिक रैम से अधिक हो जाते हैं, तो आप डिस्क पर और बाहर निकलते रहेंगे और आपका प्रदर्शन तेजी से अपमानित हो सकता है ("थ्रैशिंग" के नाम से जाना जाने वाला एक राज्य तक मूल रूप से सभी उपलब्ध चक्र जा रहे हैं पृष्ठों को अंदर और बाहर लाने के कार्य, और वास्तविक कार्य की नगण्य मात्रा वास्तव में किया जा सकता है)।

कुल मिलाकर, एक सामान्य मामूली राशि (सामान्य रूप से कुछ एमबी कहें) शायद निष्पादन योग्य कोड (पायथन की अपनी निष्पादन योग्य फाइलें, डीएलएल या एसएसओ) और बाइटकोड और सामान्य समर्थन द्वारा उठाए जा रहे हैं डेटास्ट्रक्चर जो सक्रिय रूप से स्मृति में आवश्यक हैं; एक ठेठ आधुनिक मशीन पर जो अन्य महत्वपूर्ण या जरूरी कार्यों को नहीं कर रही है, आप रैम के गीगाबाइट की तुलना में इस ओवरहेड को लगभग अनदेखा कर सकते हैं जो कि आप कुल मिलाकर उपलब्ध हैं (हालांकि स्थिति एम्बेडेड सिस्टम पर अलग हो सकती है)।

बाकी सभी आपके डेटा के लिए उपलब्ध है - जिसमें यह फ़ाइल शामिल है जिसमें आप स्मृति में पढ़ रहे हैं, साथ ही साथ किसी अन्य महत्वपूर्ण डेटा संरचनाएं भी शामिल हैं। फ़ाइल के डेटा के "संशोधनों" आमतौर पर फ़ाइल की सामग्री के आकार (यदि आप इसे स्ट्रिंग में रखते हैं) के रूप में दो बार जितनी मेमोरी लेते हैं (अधिकांशतः, यदि आप एक प्रतिलिपि रखते हैं पुराने डेटा के साथ-साथ नई संशोधित प्रतियां/संस्करण बनाना।

तो एक सामान्य आधुनिक 32-बिट मशीन पर "केवल पढ़ने के लिए" उपयोग के लिए, कहें, 2 जीबी रैम समग्र रूप से, स्मृति में पढ़ना (कहना) 1.5 जीबी कोई समस्या नहीं होनी चाहिए; लेकिन यदि आप "संशोधन" कर रहे हैं तो यह 1 जीबी से काफी कम होना होगा (और यदि आपके पास स्मृति में अन्य महत्वपूर्ण डेटा संरचनाएं भी कम हैं!)। बेशक, एक समर्पित सर्वर पर पाइथन, 64-बिट ओएस, और 16 जीबी रैम के 64-बिट निर्माण के साथ, व्यावहारिक सीमाएं बहुत अलग हैं - वास्तव में उपलब्ध रैम की काफी अलग मात्रा के अनुपात में।

उदाहरण के लिए, किंग जेम्स बाइबल टेक्स्ट डाउनलोड करने योग्य here (अनजिप) के बारे में 4.4 एमबी है; इसलिए, 2 जीबी रैम वाली मशीन में, आप स्मृति में इसकी 400 छोटी संशोधित प्रतियां रख सकते हैं (अगर कुछ और स्मृति का अनुरोध नहीं कर रहा है), लेकिन 16 (उपलब्ध और एड्रेसेबल) जीबी रैम वाली मशीन में, आप कर सकते हैं 3000 से अधिक प्रतियां अच्छी तरह से रखें।

11
  • हाँ, आप कर सकते हैं
  • केवल दोष यह स्मृति उपयोग है, और अगर फ़ाइल बड़ा है संभव भी गति।
  • फ़ाइल का आकार सीमित होना चाहिए कि आपके पास स्मृति में कितनी जगह है।

सामान्यतः, ऐसा करने के बेहतर तरीके हैं, लेकिन एक-ऑफ स्क्रिप्ट के लिए जहां आप जानते हैं कि स्मृति कोई मुद्दा नहीं है, सुनिश्चित करें।

3

एकमात्र मुद्दा जो आप चला सकते हैं वह मेमोरी खपत है: पायथन में स्ट्रिंग्स अपरिवर्तनीय हैं। तो जब आप एक बाइट बदलने की जरूरत है, तो आप पुराने स्ट्रिंग कॉपी करने की जरूरत है:

new = old[0:pos] + newByte + old[pos+1:] 

यह तीन बार old की स्मृति अप करने के लिए की जरूरत है।

स्ट्रिंग के बजाय, आप array का उपयोग कर सकते हैं। यदि आपको सामग्री को संशोधित करने की आवश्यकता है तो ये बहुत बेहतर प्रदर्शन प्रदान करते हैं और आप उन्हें स्ट्रिंग से आसानी से बना सकते हैं।

4
with open(filename) as f: 

यह केवल यूनिक्स पर पायथन 2.x पर काम करता है। यह आपके द्वारा Python 3.x या Windows पर अपेक्षा नहीं करेगा, क्योंकि ये दोनों टेक्स्ट और बाइनरी फ़ाइलों के बीच एक मजबूत भेद आकर्षित करते हैं। यह निर्दिष्ट करने के लिए है कि फाइल बाइनरी है, इस तरह बेहतर है:

with open(filename, 'rb') as f: 

यह विंडोज पर ओएस CR/वामो रूपांतरण बंद हो जाएगा, और यूनिकोड वर्ण के बजाय एक बाइट सरणी वापस जाने के लिए अजगर 3.x बाध्य करेगा।

आपके शेष प्रश्न के लिए, मैं लेनार्ट रीगेब्रो (संयुक्त) उत्तर के साथ सहमत हूं।

0

हां आप -प्रोविड फ़ाइल को काफी छोटा कर सकते हैं-।

यह किसी भी कंटेनर/पुनरावर्तनीय प्रकार के साथ किसी भी कंटेनर/पुनरावर्तनीय प्रकार के रूप में वापसी, स्ट्रिंग.split() के साथ, "एक बार में" फ़ाइल को जारी रखने के लिए संबंधित कार्यात्मक प्रोग्रामिंग सुविधाओं के साथ-साथ वापसी को परिवर्तित करने के लिए भी बहुत ही पाइथोनिक है।

1

तुम भी पायथन के v3 सुविधा का उपयोग कर सकते हैं:,

>>> ''.join(open('htdocs/config.php', 'r').readlines()) 
"This is the first line of the file.\nSecond line of the file" 

और पढ़ें यहाँ http://docs.python.org/py3k/tutorial/inputoutput.html

+1

मेरे अन्य टिप्पणी देखें डुप्लिकेट जवाब के साथ पुरानी पोस्ट स्पैमिंग रचनात्मक नहीं है। – Kev

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