2009-10-07 10 views
11

मेरे पास बड़ी टेक्स्ट फाइलों (1 गीगा तक) की एक श्रृंखला है जो एक प्रयोग से उत्पादन कर रहे हैं जिसे पायथन में विश्लेषण करने की आवश्यकता है। ,वृद्धिशील रूप से एक numpy सरणी बनाने और स्मृति उपयोग मापने

  • पंक्तियों की संख्या लोड हो रहा है की शुरुआत में अज्ञात है के रूप में, कैसे कर सकते हैं एक बहुत बड़ी numpy सरणी सबसे अधिक कुशलता से बनाया जा: वे सबसे अच्छा एक 2D numpy सरणी, जो पहला सवाल प्रस्तुत करता है में लोड किया जाएगा पंक्ति से पंक्ति?

बस सरणी में पंक्ति जोड़ना स्मृति शर्तों में अक्षम होगा, क्योंकि दो बड़े सरणी क्षणिक रूप से सह-अस्तित्व में रहेंगे। यदि आप numpy.append का उपयोग करते हैं तो वही समस्या उत्पन्न होगी। stack फ़ंक्शंस वादा कर रहे हैं, लेकिन आदर्श रूप में मैं जगह में सरणी विकसित करना चाहता हूं।

यह दूसरा सवाल की ओर जाता है:

  • एक अजगर प्रोग्राम है जो भारी NumPy सरणी का उपयोग करता है की स्मृति के उपयोग का निरीक्षण करने के लिए सबसे अच्छा तरीका क्या है? heapy और pympler - -

ऊपर समस्या का अध्ययन करने के लिए, मैं हमेशा की तरह स्मृति उपकरणों की रूपरेखा का उपयोग किया है, लेकिन केवल (80 बाइट्स) बाहरी सरणी वस्तुओं के आकार और नहीं डेटा वे युक्त कर रहे हैं हो रही है। पाइथन प्रक्रिया का कितना मेमोरी उपयोग कर रहा है, इसकी कच्ची माप से सहायक, मैं बढ़ने के साथ सरणी के "पूर्ण" आकार को कैसे प्राप्त कर सकता हूं?

स्थानीय विवरण: ओएसएक्स 10.6, पायथन 2.6, लेकिन सामान्य समाधान का स्वागत है।

उत्तर

7

यह सुनिश्चित करने का कोई तरीका नहीं है कि आप अधिकतम संभव आकार के रिक्त सरणी (numpy.empty) बनाने के बाद और अंत में इसके दृश्य का उपयोग करके अन्य जगहों में सरणी को बढ़ा सकते हैं। आप छोटे से शुरू नहीं कर सकते हैं क्योंकि इस बात की कोई गारंटी नहीं है कि आप किसी भी अन्य डेटा को क्लॉबर किए बिना मानचित्र की जो भी स्मृति का विस्तार कर सकते हैं। (और यह सब पाइथन की तुलना में बहुत कम स्तर है जो आपको दुभाषिया के अंदर से प्राप्त करने की अनुमति देता है।)

आपकी सर्वश्रेष्ठ शर्त शायद numpy.fromiter है। स्रोत को देखते हुए, वस्तुओं की संख्या में वृद्धि होने के कारण, सरणी को हर बार 50% से थोड़ा अधिक बढ़ाया जाता है। यदि आप आसानी से पंक्तियों की संख्या प्राप्त कर सकते हैं (लाइनों की गिनती से कहें), तो आप इसे एक गिनती भी पारित कर सकते हैं।

1

संभव विकल्प पर फ़ाइल को लोड करने के बिना पंक्तियों की संख्या को गिनने के लिए फ़ाइल के माध्यम से एक ही पास करना है।

अन्य विकल्प आपके तालिका आकार हर बार है, जो दो लाभ हैं दोगुना करने के लिए है:

  1. आप केवल फिर से alloc स्मृति लॉग (एन) बार जहां n पंक्तियों की संख्या है।
  2. आप केवल अपने सबसे बड़ा तालिका आकार की तुलना में 50% अधिक राम जरूरत

आप गतिशील मार्ग ले, तो आप बाइट्स में पहली पंक्ति की लंबाई को मापने सकता है, तो गणना के द्वारा पंक्तियों की संख्या अनुमान (संख्या पहली पंक्ति में फ़ाइल/अंक बाइट्स में बाइट्स)। इस आकार की एक तालिका के साथ शुरू करें।

+0

धन्यवाद सब कुछ। फ़ाइल के आकार को देखते हुए, मैं लाइनों की गिनती करने के लिए प्रारंभिक पास करने के लिए अनिच्छुक था, लेकिन यह स्मृति समस्या को हल करने का सबसे आसान और सबसे प्रभावी तरीका प्रतीत होता है। –

+1

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

2

क्या आपने memmap फ़ाइल का उपयोग करने की कोशिश की है? आप अपनी इनपुट फ़ाइल (यदि संभव हो तो भाग में) के माध्यम से पुनरावृत्त कर सकते हैं और इनकमिंग डेटा को कन्वर्ट कर सकते हैं और उन्हें मेमोरी-मैप किए गए numpy सरणी में पंक्तियों के रूप में डालें। अपर्याप्त मुख्य मेमोरी और स्वैप से पेजिंग आवश्यक होने पर डाउनसाइड अधिक डिस्क I/o उत्पन्न कर रहा है।

देखें: http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

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

देखें: www.pytables.org/moin/HowToUse

बेस्ट ऑफ लक!

0

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

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