2017-12-04 20 views
0

私はPythonでファイルを検索したいと思いますが、ファイルを探しているディレクトリは多くのサブディレクトリと何十万も何百万というファイルで構成されています。これまで私は次のコードを使用しましたが、それは非常に遅いです。ファイルを見つけるより速い方法がありますか?Pythonで大規模なディレクトリでファイルを高速検索する

for root, dirs, files in os.walk(search_dir): 
    for name in files: 
     if desired_filename==name: 
      ... 
+1

は 'グロブ(「** /ファイル名」)あなたのために'働くだろうか? – Shadow

+0

検索の絞り込みにディレクトリ名を使用できますか?または、異なるファイルに対して同じディレクトリ構造の複数の検索を行う場合は、ファイル名のインデックス付けを実装することができます。 –

答えて

1

@Shadowによって提案glob("**/filename")アプローチがうまく動作しない場合は、あなたがで作業ディレクトリのインデックスを作成することもできます。

import pickle 
from collections import defaultdict 

# run this once 
index = defaultdict(str) 
for path_to_file, file_name in walk(search_dir): 
    index[file_name] += '{};'.format(path_to_file) 
pickle.dump(index, 'index.bin') 

# load index 
index = pickle.load('index.bin') 

# run this to get semicolon-separated list of paths that end with the file 
paths = index['my_file.txt'] 
for path in paths.split(';')[:-1]: 
    # do stuff with the file 

ファイルのISNの「数十万」それは大量であり、パスの長さに応じてRAMで約10-100Mbを要します。私はdefaultdict(str)を使用してメモリ使用量を短く予測しますが、defaultdict(list)またはdefaultdict(tuple)でも試してみることができます。


このアプローチの実行速度のアイデアを得るために、あなたはこれを試すことができます。

>>> d = { 
    'file_{}.csv'.format(i): '/home/user/data/{};/home/user/backup;'.format(i) 
    for i in range(500000) 
} 
>>> d['file_4021.csv'] 
'/home/user/data/4021;/home/user/backup;' 
関連する問題