2012-06-22 12 views
5

को पाठ फ़ाइल अजगर 2.7 में 2GB, जब मैं इस तरह त्वरित संसाधन के स्मृति में 2.5GB की एक पाठ फ़ाइल से सभी डेटा लोड:अजगर लोड स्मृति

>>> f = open('dump.xml','r') 
>>> dump = f.read() 

मैं निम्नलिखित त्रुटि मिली:

Python(62813) malloc: *** mmap(size=140521659486208) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 

पाइथन 2563749237 बाइट्स डेटा के लिए 140521659486208 बाइट मेमोरी आवंटित करने का प्रयास क्यों किया? मैं सभी बाइट्स को लोड करने के लिए कोड को कैसे ठीक करूं?

मेरे पास लगभग 3 जीबी रैम मुफ्त है। फ़ाइल एक विकिपीडिया xml डंप है।

+7

स्रोत को पहले लोड करने के बिना आप XML को रैखिक रूप से क्यों नहीं पा रहे हैं? – Alfe

+0

मैंने कोशिश की और मुझे बहुत लंबा लगा। और चूंकि मेरे पास बहुत सी रैम है, इसलिए मैं इसे तेजी से बनाने के लिए सब कुछ रैम में लोड करना चाहता हूं। – pckben

+0

कितना राम? 64 या 32 बिट? – joslinm

उत्तर

10

यदि आप mmap का उपयोग करते हैं, तो आप पूरी फ़ाइल को तुरंत स्मृति में लोड करने में सक्षम होंगे।

import mmap 

with open('dump.xml', 'rb') as f: 
    # Size 0 will read the ENTIRE file into memory! 
    m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) #File is open read-only 

    # Proceed with your code here -- note the file is already in memory 
    # so "readine" here will be as fast as could be 
    data = m.readline() 
    while data: 
    # Do stuff 
    data = m.readline() 
+0

मुझे 'mmap.error मिला: [Errno 13]' m = mmap.mmap (..) 'के साथ लाइन के लिए अनुमति अस्वीकृत', मैं इसे कैसे ठीक करूं? – pckben

+2

@pckben ऐसा इसलिए है क्योंकि फ़ाइल केवल-पढ़ने योग्य मोड में खुली है और mmap रीड-राइट मैप करने का प्रयास करेगा: '' mm =.mapap 'कॉल में' prot = mmap.PROT_READ' जोड़ें, और आप ठीक होंगे। –

+1

कूल। इसने काम कर दिया! क्या आप समझाएंगे कि क्या हुआ? – pckben

0

कुछ त्वरित Googling के आधार पर, मैं this forum post में आए मुद्दा यह है कि आप होने होना दिखाई देते हैं पता करने के लिए लगता है कि। यह मानते हुए कि आप त्रुटि कोड के आधार पर मैक या लिनक्स चला रहे हैं, आप फोरम पोस्ट में सुझाए गए अनुसार gc.enable() या gc.collect() के साथ कचरा संग्रहण लागू करने का प्रयास कर सकते हैं।

+0

मेरा कोड स्मृति में डेटा लोड करने के लिए दी गई केवल 2 पंक्तियां हैं, कचरा संग्रह के लिए कोई अन्य जीवित वस्तु नहीं है। – pckben

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