部分的なディレクトリリストを取得することは可能ですか?部分的なディレクトリリスト
Pythonでは、私は、ファイルの> 100,000を含むディレクトリのos.listdir
を取得しようとするプロセスがあり、それは永遠にかかる。最初の1000個のファイルのリストをすばやく取得できるようにしたいと思います。
どうすればこの問題を解決できますか?
部分的なディレクトリリストを取得することは可能ですか?部分的なディレクトリリスト
Pythonでは、私は、ファイルの> 100,000を含むディレクトリのos.listdir
を取得しようとするプロセスがあり、それは永遠にかかる。最初の1000個のファイルのリストをすばやく取得できるようにしたいと思います。
どうすればこの問題を解決できますか?
私はthis post in the python maillistを見つけ
まず(少なくとも私はパターンを見ることができない):)私のファイルのランダムな順序を与える解決策を見つけました。ディスクにコピーする必要があるファイルが3つ添付されています(opendir.pyx, setup.py, test.py
)。次に、投稿からopendir.pyx
ファイルをコンパイルするには、PythonパッケージPyrexが必要です。私はPyrexをインストールする際に問題があり、apt-get
でpython-dev
をインストールしなければならないことがわかりました。次に、上記の3つのダウンロードファイルのopendir
パッケージをpython setup.py install
でインストールしました。ファイルtest.py
には、その使用方法の例が含まれています。
次は、このソリューションがos.listdirを使用するよりもずっと速く、次の小さなシェルスクリプトを使用して200000個のファイルを作成することに興味がありました。
for((i=0; i<200000; i++))
do
touch $i
done
次のスクリプトは、私はちょうどファイルを作成したディレクトリで実行している私のベンチマークです:
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]
あなたが私を見ることができるように100000のファイル名を持つリストを200000から返すときに200倍のスピードアップを得ました。
私はこれがあなたが達成しようとしている目標だと願っています。
+1:興味深いですが、私はむしろより標準的なソリューションを持っています。 – jldupont
これは使用する可能性があります。http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-1/ – Kev
ニート!私はそれを知らなかった。 –
注文は重要ですか? –