2013-12-16 3 views
11

पर लिखना मैं लाखों पंक्तियों और 100+ स्तंभों के साथ ओरेकल डेटाबेस के साथ काम कर रहा हूं। मैं इस डेटा को एचडीएफ 5 फाइल में संग्रहीत कुछ कॉलम के साथ pytables का उपयोग करके स्टोर करने का प्रयास कर रहा हूं। मैं इन डेटा के सबसेट को पांडा डेटाफ्रेम में और कंप्यूटेशंस कर रहा हूं।ओरेकल से लाखों पंक्तियों के साथ एक बड़ी तालिका पढ़ना और एचडीएफ 5

मैं का प्रयास किया है निम्नलिखित:

डाउनलोड मेज, एक csv फ़ाइल में एक सुविधा का उपयोग, पांडा का उपयोग कर हिस्सा द्वारा csv फ़ाइल हिस्सा पढ़ सकते हैं और pandas.HDFStore का उपयोग कर HDF5 मेज पर जोड़ देते हैं। मैंने एक प्रकार की परिभाषा बनाई और अधिकतम स्ट्रिंग आकार प्रदान किए।

हालांकि, अब जब मैं सीधे ओरेकल डीबी से डेटा डाउनलोड करने की कोशिश कर रहा हूं और इसे pandas.HDFStore के माध्यम से एचडीएफ 5 फ़ाइल में पोस्ट कर रहा हूं, तो मैं कुछ समस्याओं में भाग लेता हूं।

pandas.io.sql.read_frame खंडित पढ़ने का समर्थन नहीं करता है। मेरे पास संपूर्ण डेटा को पहले स्मृति में डाउनलोड करने में सक्षम होने के लिए पर्याप्त RAM नहीं है।

यदि मैं cursor.fecthmany() का उपयोग निश्चित रिकॉर्ड्स के साथ करने का प्रयास करता हूं, तो पढ़ने के ऑपरेशन को डीबी तालिका में उम्र लगती है और मुझे दिनांक सीमा के अंतर्गत आने वाले रिकॉर्ड पढ़ना पड़ता है। मैं DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype) का उपयोग कर रहा हूं, हालांकि, निर्मित डेटाफ्रेम हमेशा प्रदान किए गए प्रकार को लागू करने के बजाय टाइप प्रकार का अनुमान लगाता है (read_csv के विपरीत जो मेरे द्वारा प्रदान किए गए प्रकार का पालन करता है)। इसलिए, जब मैं इस डेटाफ्रेम को पहले से मौजूद HDFDatastore पर जोड़ता हूं, तो उदाहरण के लिए एक प्रकार का मेल नहीं है एक फ्लोट 64 शायद एक खंड में int64 के रूप में व्याख्या की जाएगी।

यदि आप लोग अपने विचार पेश कर सकते हैं और मुझे सही दिशा में इंगित कर सकते हैं तो सराहना करें।

+7

आपका वर्तमान दृष्टिकोण (एक सीएसवी के साथ) और टाइप प्रकार सुधार सही है। एसक्यूएल को 0.14 में एक बड़ा अपडेट मिलेगा (0.13 जल्द ही रिलीज़ हो रहा है)। तो दुर्भाग्यवश dtype संक्रमण/चंकिंग उपलब्ध नहीं है। आपका स्वागत है पीआरएस हालांकि! इस समस्या को देखें: https://github.com/pydata/pandas/issues/4163 – Jeff

+2

मैं ओरेकल टैग को हटाने का सुझाव देता हूं जब तक कि आपको चीजों के ओरेकल पक्ष पर कोई समस्या न हो। –

+1

आपको तालिका को एक श्रेणी विभाजित ऑब्जेक्ट में कनवर्ट करने के लिए अपने डीबीए से पूछना चाहिए, उसके बाद विभाजन – klashxx

उत्तर

1

खैर, अब के लिए ही व्यावहारिक समाधान के बाद से यह बाहर के स्मृति ऑपरेशन के लिए डिज़ाइन किया गया है सीधे PyTables उपयोग करने के लिए है ... यह थोड़ा कठिन है, लेकिन ऐसा नहीं है कि बुरा है:

http://www.pytables.org/moin/HintsForSQLUsers#Insertingdata

एक और दृष्टिकोण

"Large data" work flows using pandas

0

ठीक है, तो मैं Oracle डेटाबेस का अधिक अनुभव नहीं है, लेकिन यहाँ है कुछ विचार:, पांडा का उपयोग कर, यहाँ है

इंडेक्सिंग की कमी की वजह से ऑरैकल से किसी भी विशेष रिकॉर्ड के लिए आपका एक्सेस समय धीमा है, और तथ्य यह है कि आप टाइमस्टैम्प ऑर्डर में डेटा चाहते हैं।

सबसे पहले, आप डेटाबेस के लिए अनुक्रमण सक्षम नहीं कर सकते हैं?

यदि आप डेटाबेस में हेरफेर नहीं कर सकते हैं, तो संभवतः आप एक निश्चित सेट का अनुरोध कर सकते हैं जिसमें केवल प्रत्येक पंक्ति के लिए ऑर्डर किए गए अद्वितीय आईडी शामिल हों?

आप संभावित रूप से इस डेटा को अद्वितीय आईडी के एक सरणी के रूप में संग्रहीत कर सकते हैं, और आपको स्मृति में फिट होना चाहिए। यदि आप प्रत्येक अद्वितीय कुंजी (रूढ़िवादी अनुमान, ओवरहेड इत्यादि शामिल हैं) के लिए 4k की अनुमति देते हैं, और आप टाइमस्टैम्प नहीं रखते हैं, तो यह केवल पूर्णांक की एक सरणी है, यह 3 मिलियन रिकॉर्ड के लिए लगभग 1.1 जीबी रैम का उपयोग कर सकती है। यह एक संपूर्ण ढेर नहीं है, और संभवतः आप केवल सक्रिय डेटा की एक छोटी सी खिड़की चाहते हैं, या शायद आप पंक्ति से पंक्ति संसाधित कर रहे हैं?

यह सब करने के लिए जेनरेटर फ़ंक्शन बनाएं।इस तरह, एक बार जब आप पुनरावृत्ति पूर्ण कर लेते हैं तो इसे स्मृति को मुक्त करना चाहिए, बिना किसी चीज के, और यह आपके कोड को आसानी से पालन करने और आपके गणना लूप के वास्तविक महत्वपूर्ण तर्क को फूलने से बचाता है।

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

इसकी आवाज़ से, आप डेटाबेस को सारणित कर सकते हैं, और पांडा अनुरोधों को दे सकते हैं। यह देखने लायक हो सकता है कि यह परिणामों को सीमित कैसे कर रहा है। आपको सभी डेटा के लिए अनुरोध करने में सक्षम होना चाहिए, लेकिन डेटाबेस सर्वर से एक समय में परिणाम केवल एक पंक्ति लोड करें।

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