2012-08-29 7 views
7

क्या आंशिक निर्देशिका सूची प्राप्त करना संभव है?आंशिक निर्देशिका लिस्टिंग

पायथन में, मेरे पास एक ऐसी प्रक्रिया है जो os.listdir निर्देशिका में शामिल है जिसमें 100,000 फाइलें हैं और यह हमेशा के लिए लेती है। मैं जल्दी से पहले 1,000 फाइलों की सूची प्राप्त करने में सक्षम होना चाहता हूं।

मैं इसे कैसे प्राप्त कर सकता हूं?

+4

यह उपयोग में हो सकता है: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/ – Kev

+0

साफ! मुझे यह नहीं पता था। –

+1

क्या ऑर्डर महत्वपूर्ण है? –

उत्तर

3

मैं एक समाधान है कि मुझे फ़ाइलें :) (कम से कम मैं एक पैटर्न नहीं देख सकते हैं) के एक यादृच्छिक क्रम

सबसे पहले मैं this post in the python maillist पाया देता पाया। 3 फाइलें संलग्न हैं जिन्हें आपको अपनी डिस्क (opendir.pyx, setup.py, test.py) पर प्रतिलिपि बनाना है। इसके बाद आपको पोस्ट से opendir.pyx फ़ाइल संकलित करने के लिए पाइथन पैकेज Pyrex की आवश्यकता है। मुझे Pyrex इंस्टॉल करने में समस्याएं थीं और पाया कि मुझे python-devapt-get के माध्यम से स्थापित करना था। इसके बाद मैंने python setup.py install के साथ तीन उपरोक्त डाउनलोड की गई फ़ाइलों से opendir पैकेज स्थापित किया। फ़ाइल test.py में उदाहरण हैं कि इसका उपयोग कैसे करें।

अगला मुझे दिलचस्पी थी कि यह समाधान os.listdir का उपयोग करने से कितना तेज़ होगा और मैंने निम्नलिखित छोटी शेलस्क्रिप्ट के साथ 200000 फाइलें बनाई हैं।

from opendir import opendir 
from timeit import Timer 
import os 

def list_first_fast(i): 
    d=opendir(".") 
    filenames=[] 
    for _ in range(i): 
     name = d.read() 
     if not name: 
      break 
     filenames.append(name) 
    return filenames 

def list_first_slow(i): 
    return os.listdir(".")[:i] 

if __name__ == '__main__': 
    t1 = Timer("list_first_fast(100)", "from __main__ import list_first_fast") 
    t2 = Timer("list_first_slow(100)", "from __main__ import list_first_slow") 
    print "With opendir: ", t1.repeat(5, 100) 
    print "With os.list: ", t2.repeat(5, 100) 

अपने सिस्टम पर उत्पादन होता है:

With opendir: [0.045053958892822266, 0.04376697540283203, 0.0437769889831543, 0.04387712478637695, 0.04404592514038086] 
With os.list: [9.50291895866394, 9.567682027816772, 9.865844964981079, 13.486984968185425, 9.51977801322937] 

आप मुझे देख सकते हैं

for((i=0; i<200000; i++)) 
do 
    touch $i 
done 

निम्न स्क्रिप्ट मेरे बेंचमार्क निर्देशिका में चल रहा है, जहां मैं सिर्फ फ़ाइलें बनाई है 200000 के बाहर 100 फाइलनामों के साथ एक सूची लौटने पर 200 के एक कारक की गति मिली, यह बहुत अच्छा है :)।

मुझे आशा है कि यह वह लक्ष्य है जिसे आप प्राप्त करने का प्रयास कर रहे हैं।

+0

+1: दिलचस्प लेकिन मैं एक और अधिक मानक समाधान होगा। – jldupont

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