2011-12-09 5 views
6

मैं बड़े डेटा के साथ काम कर रहा हूँ में बड़ी मात्रा में डेटा को पढ़ने के लिए इतना डाटा पढ़ने में एक अच्छा तरीका खोजने के तरीके वास्तव में महत्वपूर्ण है। मैं बस थोड़ा अलग पढ़ने के तरीकों के बारे में उलझन में हूँ।अलग, अजगर

1.f=gzip.open(file,'r') 
     for line in f: 
      process line 
    #how can I process nth line? can I? 
2.f=gzip.open(file,'r').readlines() 
    #f is a list 
    f[10000] 
    #we can process nth line 

3.f=gzip.open(file,'r') 
    while True: 
     linelist=list(islice(f,4)) 

4.for line in fileinput.input(): 
    process line 

2 और 3 के बीच क्या अंतर है? मुझे लगता है कि उनका मेमोरी उपयोग वही है। islice() भी पहली स्मृति में पूरे फ़ाइल को लोड करने की जरूरत है (लेकिन सिर्फ बाद में थोड़ा करके बिट लेने के लिए)। और मैंने सुना है कि 4 विधि कम से कम स्मृति लगता है, यह वास्तव में थोड़ा थोड़ा करके, प्रसंस्करण है ना? 10GB पैमाने पर फ़ाइल के लिए, जो फाइल पढ़ने विधि की सलाह देंगे? किसी भी विचार/जानकारी का स्वागत है। THX

संपादित करें: मुझे लगता है मेरी समस्या में से एक मैं बेतरतीब ढंग से कभी कभी विशिष्ट लाइनों बाहर लेने की जरूरत है। कहें:

f1=open(inputfile1, 'r') 
while True: 
    line_group1 = list(islice(f1, 3)) 
    if not line_group1: 
     break 
    #then process specific lines say, the second line. 
    processed 2nd line 
    if (....): 
      LIST1.append(line_group1[0]) 
      LIST1.append(processed 2nd line) 
      LIST1.append(line_group1[2]) 

और फिर sth।

with open(file,'r') as f, 
    for line in f: 
     # process line 

काम नहीं कर सकता, क्या मैं सही हूँ? -

with open(...) as f: 
    for line in f: 
     <do something with line> 

with बयान हैंडल

http://www.dabeaz.com/generators/

+0

इसलिए बड़ी टेक्स्ट फ़ाइल में यादृच्छिक रेखा पहुंच की आवश्यकता है? –

+0

अच्छा, वास्तव में जरूरी नहीं है। मूल रूप से अभी भी रेखा से लाइन की प्रक्रिया; या एक समूह के रूप में एन लाइनें। – user815408

उत्तर

4

आप भूल गया:

+0

जेएनई उद्धरण के संपादन के बाद दूसरी बार +1 नहीं किया जा सका ... नैतिक रूप से किया गया! ;) – mac

+0

thx, लेकिन क्या आप मेरे संपादन को देख सकते हैं? कभी-कभी मुझे विशिष्ट रेखा लेने की आवश्यकता होती है (कहें, 10000 वें लाइन)। तो मैं कैसे कर सकता हूँ? – user815408

+0

सरल, फिर 'काउंटर' रखें जो मूल रूप से रेखा संख्या है। जांचें कि इसकी 10000 वीं लाइन है और अपना विशेष हैंडलिंग करें। –

5

जनरेटर के साथ बड़े लॉग फ़ाइलों को पार्स करने पर डेविड एम Beazley के वार्ता (प्रस्तुति के लिए पीडीएफ देखें) बाहर की जाँच करें फ़ाइल खोलना और बंद करना, जिसमें आंतरिक ब्लॉक में अपवाद उठाया गया है। for line in f फ़ाइल ऑब्जेक्ट f को एक पुनरावृत्त के रूप में मानता है, जो स्वचालित रूप से buffered IO और मेमोरी प्रबंधन का उपयोग करता है, इसलिए आपको बड़ी फ़ाइलों के बारे में चिंता करने की आवश्यकता नहीं है।

दोनों 2,3 बड़ी फ़ाइलों के लिए सलाह नहीं दी जाती क्योंकि वे प्रसंस्करण शुरू होने से पहले & लोड स्मृति में पूरी फ़ाइल सामग्री पढ़ें। बड़ी फ़ाइलों को पढ़ने के लिए आपको पूरी फ़ाइल को एक ही बार में पढ़ने के तरीकों को खोजने की आवश्यकता नहीं है।

एक होना चाहिए - और अधिमानतः इसे करने के लिए केवल एक स्पष्ट तरीका होना चाहिए।

1

आप enumerate उपयोग कर सकते हैं के रूप में आप कुछ अधिक पुनरावृति एक सूचकांक प्राप्त करने के लिए:

for idx, line in enumerate(f): 
    # process line 

सरल और स्मृति कुशल। आप वास्तव में islice भी उपयोग कर सकते हैं, और इस पर पुनरावृति पहले एक सूची में रूपांतरित किए बिना:

for line in islice(f,start,stop): 
    # process line 

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

fileinput के लिए, यह मानक इनपुट या फ़ाइलों की सूची में तेज़ी से लूपिंग के लिए केवल एक सहायक वर्ग है, इसका उपयोग करने के लिए कोई स्मृति-दक्षता लाभ नहीं है।

Srikar बताते हैं के रूप में, with कथन का उपयोग खोलने/एक फ़ाइल को बंद करने के लिए पसंदीदा तरीका है।

+0

इस्लिस (एफ, 4) के साथ, अगर मैं कोई सूची नहीं बनाता, तो मैं कैसे उठा सकता हूं पहली, दूसरी, तीसरी और चौथी लाइनों से बाहर? (जैसा कि मैं पोस्ट में करता हूं) – user815408

+0

बस सामान्य रूप से इसे फिर से चालू करें, 'इस्लाइस में लाइन के लिए (एफ, 4): प्रिंट लाइन' लाइन 1,2,3,4 प्रिंट करेगी। यदि आप 2 से 5 लाइन चाहते थे तो आप 'इस्लिस (2,6)' के बजाय इत्यादि का उपयोग कर सकते थे। – zeekay

0

आप नहीं जानते हैं कि जब तक आप इसे पढ़ने और गिनने तक कितने लाइनें नहीं जानते हैं। 1 में, आप लाइन नंबर प्राप्त करने के लिए एक अंक जोड़ सकते हैं।

0

बड़ी फ़ाइलों में विशिष्ट लाइनों को पढ़ने के लिए, आप linecache library का उपयोग कर सकते हैं।