2012-01-25 12 views
9

(पहली पंक्ति) नामित आइटम की एक बड़ी सूची पर विचार करें एक बड़ी csv फ़ाइल (80 एमबी) संभव बाधित रिक्तिपहुंच सूची

name_line = ['a',,'b',,'c' .... ,,'cb','cc'] 

मैं के शेष पढ़ रहा हूँ के साथ से लौटे रेखा से लाइन में डेटा और मुझे केवल इसी नाम के साथ डेटा संसाधित करने की आवश्यकता है। डेटा

data_line = ['10',,'.5',,'10289' .... ,,'16.7','0'] 

मैंने इसे दो तरीकों से आजमाया। एक पढ़ा

blnk_cols = [1,3, ... ,97] 
while data: 
    ... 
    for index in blnk_cols: data_line.pop(index) 

अन्य डेटा में एल 1

good_cols = [0,2,4, ... ,98,99] 
while data: 
    ... 
    data_line = [data_line[index] for index in good_cols] 

से एक नाम के साथ जुड़े आइटम संकलन है मैं उपयोग कर रहा हूँ वहाँ निश्चित रूप से अधिक अच्छा होगा की प्रत्येक पंक्ति से खाली कॉलम पॉपिंग है लाइनें तो खराब लाइनें हालांकि यह आधा और आधा जितना ऊंचा हो सकता है।

मैंने गति में अपने सबसे कमजोर लिंक निर्धारित करने के लिए cProfile और pstats पैकेज का उपयोग किया जो सुझाव दिया कि पॉप वर्तमान धीमी वस्तु थी। मैं सूची COMP में स्विच किया और समय लगभग दोगुना हो गया।

मुझे लगता है कि एक तेज़ तरीका केवल अच्छा डेटा पुनर्प्राप्त करने वाले सरणी को टुकड़ा करना होगा, लेकिन यह रिक्त और अच्छे डेटा के साथ फ़ाइलों के लिए जटिल होगा।

क्या मैं वास्तव में जरूरत है

data_line = data_line[good_cols] 

प्रभावी ढंग से उन वस्तुओं वापस पाने के लिए एक सूची में सूचकांक की एक सूची गुजर करने में सक्षम हो रहा है। अभी मेरा प्रोग्राम 10 एमबी फ़ाइल के लिए लगभग 2.3 सेकंड में चल रहा है और पॉप लगभग 3 सेकंड के लिए खाता है।

क्या सूची में कुछ स्थानों तक पहुंचने का कोई तेज़ तरीका है। सी में यह केवल सरणी में सही सूचकांक के पॉइंटर्स की एक सरणी को संदर्भित करेगा।

परिवर्धन: फ़ाइल में name_line से पहले पढ़

a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n, 

name_line के बाद पढ़ने के लिए और विभाजन (",")

['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n'] 
+0

डेटा_लाइन के साथ आप क्या कर रहे हैं? क्या आप इसे फिर से कर रहे हैं? क्या आप इसे किसी अन्य डेटास्ट्रक्चर में डाल रहे हैं? – Marcin

+0

इसके अलावा, क्या आपने जनरेटर की कोशिश की है? – Marcin

+0

"एक बड़ी सीएसवी फ़ाइल से लौटाई गई बड़ी सूची पर विचार करें"? क्या आप ** संपूर्ण ** फ़ाइल को एक सूची में पढ़ रहे हैं? क्यूं कर? प्रत्येक पंक्ति को व्यक्तिगत रूप से क्यों संसाधित नहीं करते? –

उत्तर

8

एक जनरेटर अभिव्यक्ति की कोशिश करें,

data_line = (data_line[i] for i in good_cols) 

भी पढ़ यहां Generator Expressions vs. List Comprehension

शीर्ष उत्तर के रूप में आपको बताता है: 'मूल रूप से, जनरेटर अभिव्यक्ति का उपयोग करें यदि आप जो भी कर रहे हैं वह एक बार फिर से चल रहा है'।

तो आपको इससे फायदा होना चाहिए।

+0

की कुल कमी के लिए मुझे अपेक्षित लाभ (पॉप टाइम को हटाने और थोड़ा सा बढ़ावा देने) मिला जो कि इसके साथ आप क्या कर रहे हैं इस पर निर्भर करता है। जनरेटर का लाभ यह है कि यह आलसी है, इसलिए आप उन वस्तुओं के लिए बहुत मेमोरी आवंटित नहीं करते हैं जिन्हें आप केवल एक बार एक्सेस करते हैं। – Marcin

+0

@ मार्सिन। हां, मेरे जवाब को स्पष्ट किया। –

+0

जनरेटर अभिव्यक्तियों को फिट करने के लिए मेरे सभी कोड को दोबारा प्रतिक्रिया दी। मैं प्रक्रिया के लिए एक बार प्रत्येक डेटा लाइन के माध्यम से जाता हूं (शुरुआत में रिक्त मूल्यों को पॉप करने के बजाय उचित अनुक्रमण के साथ जेनरेटर का उपयोग करके)। कोड लगभग 3 सेकंड धीमा चलता है क्योंकि मुझे प्रत्येक डेटा लाइन के लिए जेनरेटर अभिव्यक्ति को फिर से बनाने की आवश्यकता होती है। –

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