2017-09-10 14 views
-1

私は、Pythonを使って、約9つの他のディレクトリを含む大きなディレクトリ(約1.1TB)を探索し、複数のLinuxサーバ上の200GB以上のファイルを見つけるより速い方法を探しています。 PythonになるPythonで大きなファイルを高速に見つける方法はありますか?

私はスクリプトでdu-hを呼び出すように多くのことを試しましたが、duはちょうど1TBほどの大きさのディレクトリを通過するには遅すぎます。 私はfind ./ + 200Gのようなfindコマンドも試してきましたが、それもやりがいがあります。

私もos.walk()と.getsize()を試しましたが、同じ問題です。遅すぎます。 これらの方法はすべて数時間かかるので、誰かが私を助けることができれば、私は別の解決策を見つけるのを助ける必要があります。 1つのサーバー上で大規模なファイルを検索するだけでなく、300台のサーバーを介してsshを実行し、200GBを超えるすべてのファイルの巨大なリストを出力しなければならないので、私が試した3つの方法はそれを達成することができます。 ご協力いただきありがとうございます!

+0

残念ながら、そうする方法はありません。たとえば、「Everything」というプログラムはドライブ全体を索引付けし、フィルターに基づいてファイルをソートすることができます。このプログラムでさえ、この「速い道」を見つけることができません。 Pythonは異なるものであってはなりません。 os.walkと.getsize()は主にオペレーティングシステムに依存し、主に非Pythonコードを実行するため、別の言語を使用しても何も変更されません。 – ProgramFast

+3

私はpythonがディスクの読み取り速度を向上させるとは思わない。私はあなたが探しているのは並列化して、同時にすべてのサーバをチェックできることだと思います。その後、合計で数時間かかるだけです。 –

+0

@RobertSeaman私は並列化のコンセプトに精通していません。自分の方法で送信できる情報のリンクはありますか? – user7439019

答えて

0

os.walk()duよりもかなり高速にディレクトリをトラバースする方法があるとは想像もつきません。検索を並列化すると、一部の設定(たとえばSSD)で少しは役に立ちますが、劇的な違いはありません。

物事をより速くする簡単な方法は、自動的に1時間ごとにバックグラウンドでスクリプトを実行し、実際のスクリプトで結果を取り上げることです。結果が最新である必要がある場合、これは役に立ちませんが、多くの監視設定で有効です。

2

あなたはos.walk()

scandirより良いを行うことができないというのは本当ではありません2〜20倍高速であると言われています。 https://pypi.python.org/pypi/scandirから

Pythonの組み込みのos.walk()ので、それは必要以上にかなり遅いです - 加えて、各ディレクトリ上)(LISTDIRを呼び出す - それは、それぞれ上のstat()を呼び出し、ファイル名がディレクトリかどうかを調べます。しかし、Windows上のFindFirstFile/FindNextFileとLinux/OS X上のreaddirは、すでに返されたファイルがディレクトリかどうかを示しているので、それ以上のstatシステムコールは必要ありません。要約すると、システムコールの数を約2NからNに減らすことができます.Nはツリー内のファイルとディレクトリの総数です。

実際には、これらの余分なシステムコールをすべて削除すると、Windowsではos.walk()が約7〜50倍、LinuxとMac OS Xでは約3〜10倍速くなります。マイクロ最適化についてpython 3.5から

PEP 471のおかげで、scandirは現在、内蔵されて、osパッケージで提供。小(未テスト)例:

for dentry in os.scandir("/path/to/dir"): 
    if dentry.stat().st_size > max_value: 
     print("{} is biiiig".format(dentry.name)) 

(もちろん、あなたはいくつかの点でstatが必要ですが、機能を使用する場合os.walkであなたが暗黙的にstatと呼ばれます。またファイルがさらに節約、あなたがstatた場合にのみ、拡張マッチを行うことができ、いくつかの特定の拡張子を持っている場合)

そして、それによりがあります:だから

だけでなく、SCANDIRを提供( )iterator関数を呼び出すことで、Pythonの既存のos.walk()関数を大幅に高速化できます。

Python 3.5以上に移行すると、コードを書き直すことなく、os.walkが魔法のように高速化します。

私の経験から、statコールをネットワークドライブに乗算することはパフォーマンス上致命的です。ターゲットがネットワークドライブの場合は、ローカルディスクユーザー以上にもこの機能が役立ちます。

ネットワークドライブでパフォーマンスを得る最も良い方法は、ドライブがローカルにマウントされているマシン(たとえばsshを使用)でスキャンツールを実行することです。あまり便利ではありませんが、それだけの価値があります。

+0

2倍から20倍のスピードアップはWindowsに適用され、LinuxではOPタグでは適用されません。 OPの場合、ディレクトリからファイルを区別するだけでは不十分です。コードは実際にファイルを 'stat'する必要があります。その上、OPは、「du」も遅すぎるので、すでにディレクトリウォークを可能な限り最適化していることが明らかでした。 'scandir'からの"魔法のスピードアップ "はなく、戦略を変えなければなりません。 – user4815162342

+0

"しかし、WindowsのFindFirstFile/FindNextFileとLinux/OS Xのreaddirは、返されたファイルがディレクトリであるかどうかをすでに示しているので、これ以上のstatシステムコールは必要ありません。しかし、「デュ」がすでに遅い場合は、問題は他の場所にある可能性があります。私は結論を編集しました。 –

+0

私が言ったように、OPからファイルをディレクトリから区別するのに十分ではありません。ファイルのサイズを取得する必要もあります。多くのディレクトリがあり、階層にいくつかのファイルがある場合には、スピードアップが少ししかないと思われます。これは、ディレクトリであることが分かっているエントリを 'stat'する必要性を排除します。しかし、それは起こりそうもないようではなく、提示されたユースケースに違いはありません。 – user4815162342

関連する問題