2012-01-08 10 views
5

पर एक बड़ी NumPy सरणी लिखने के कुशल तरीके मुझे वर्तमान में PiCloud पर चल रहा एक प्रोजेक्ट मिला है जिसमें ओडीई सॉल्वर के एकाधिक पुनरावृत्तियों को शामिल किया गया है। प्रत्येक पुनरावृत्ति लगभग 30 पंक्तियों और 1500 स्तंभों की एक न्यूप्पी सरणी उत्पन्न करती है, जिसमें प्रत्येक पुनरावृत्तियों को पिछले परिणामों की सरणी के नीचे जोड़ दिया जाता है।फ़ाइल

आम तौर पर, मैं बस इन बड़े बड़े सरणी को फ़ंक्शन द्वारा वापस लौटा दूंगा, उन्हें स्मृति में रखूंगा और उन सभी को एक साथ सौदा कर दूंगा। को छोड़कर PiCloud में डेटा के आकार पर काफी प्रतिबंधित कैप है जो एक फ़ंक्शन द्वारा बाहर निकाला जा सकता है, ट्रांसमिशन लागतों को कम रखने के लिए। जो ठीक है, सिवाय इसके कि इसका मतलब है कि मुझे हजारों नौकरियां लॉन्च करना होगा, प्रत्येक पर पुनरावृत्ति पर चल रहा है, काफी ऊपरी हिस्से के साथ।

ऐसा लगता है कि फ़ाइल में आउटपुट लिखना सबसे अच्छा समाधान है, और उसके बाद फ़ाइल को अन्य फ़ंक्शन का उपयोग करके एकत्र करें जिसमें उनके पास स्थानांतरण सीमा नहीं है।

क्या यह करने के लिए मेरी सबसे अच्छी शर्त है कि इसे सिर्फ एक CSV फ़ाइल में डंप करें? क्या मुझे प्रत्येक पुनरावृत्ति सीएसवी फ़ाइल में जोड़ना चाहिए, या इसे अंत तक एक सरणी में रखें और फिर केवल एक बार लिखें? क्या कुछ गड़बड़ है मुझे याद आ रही है?

उत्तर

8

जब तक इंटरमीडिएट फ़ाइलों को मानव-पठनीय होने का कोई कारण नहीं है, तो CSV का उपयोग करें, क्योंकि इसमें अनिवार्य रूप से सटीकता का नुकसान शामिल होगा।

सबसे कुशल शायद tofile (doc) है जो फ़ाइल से डिस्क के त्वरित डंप के लिए है जब आप समय से पहले डेटा के सभी विशेषताओं को जानते हैं।

प्लेटफ़ॉर्म-स्वतंत्र, लेकिन numpy-specific के लिए, बचाता है, आप save (doc) का उपयोग कर सकते हैं।

अगर आपको पोर्टेबिलिटी की आवश्यकता है तो एचडीएफ 5 जैसे विभिन्न वैज्ञानिक डेटा प्रारूपों के लिए गड़बड़ और scipy भी समर्थन है।

+0

वास्तव में उनके लिए मानव-पठनीय होने का कोई कारण नहीं है - बस डेटा सेट के चारों ओर स्थानांतरित करने के लिए सीएसवी फ़ाइलों का उपयोग करने के लिए उपयोग किया जाता है, जहां परिशुद्धता वास्तव में कारक नहीं है (ज्यादातर चीजें पूर्णांक हैं)। ऐसा लगता है कि मैं क्या देख रहा था। – Fomite

2

मैं pickle मॉड्यूल को देखने की अनुशंसा करता हूं। pickle मॉड्यूल आपको पाइथन ऑब्जेक्ट्स को बाइट्स की धाराओं के रूप में क्रमबद्ध करने की अनुमति देता है (उदा।, स्ट्रिंग्स)। यह आपको उन्हें एक फ़ाइल में लिखने या उन्हें नेटवर्क पर भेजने की अनुमति देता है, और फिर बाद में वस्तुओं को पुन: स्थापित करता है।

+1

उपयोग अचार के बजाय cPickle, यह जिस तरह से तेजी से होता है। – Martlark

+0

अचार तत्काल उपयोग के लिए अच्छा है लेकिन इसका उपयोग तब नहीं किया जाना चाहिए जब आपको इसे पायथन के संस्करणों में बंदरगाह करना पड़े (यह पिछड़ा संगत नहीं है यानी 3.x दस्तावेज कहने के बावजूद 2.x द्वारा उठाए गए द्विआधारी डेटा को नहीं पढ़ सकता) npy प्रारूप देशी npy प्रारूप का उपयोग करें। (http://bugs.python.org/issue6784) – staticd

2

Joblib - Fast compressed persistence

joblib के प्रमुख घटक में से एक यह मनमाने ढंग से अजगर वस्तुओं जारी रहती है करने की क्षमता है है की कोशिश करो, और बहुत जल्दी उन्हें वापस पढ़ें। यह कंटेनरों के लिए विशेष रूप से कुशल है जो numpy arrays के साथ भारी भारोत्तोलन करते हैं। महान गति प्राप्त करने की चाल अलग-अलग फाइलों में अलग-अलग फ़ाइलों में सहेजने के लिए है, और उन्हें memmapping के माध्यम से लोड करें।

संपादित करें: Newer (2016) blog entry on data persistence in Joblib