2016-04-29 20 views
0

かなり遅いディスク上に数百万のアイテムがあるディレクトリがあります。これらのアイテムのうち100個を無作為にサンプリングしたいので、globも使用しています。それを行うにはPythonでディレクトリを無作為にサンプリングする最も効率的な方法

一つの方法は、そのサンプル、ディレクトリ内のすべてのファイルのグロブを得ることです:

files = sorted(glob.glob('*.xml')) 
file_count = len(files) 
random_files = random.sample(
    range(0, file_count), 
    100 
) 

しかし、私は数百万のファイルの大きなリストを構築する必要があるため、これは本当に遅いですこれは、多くのディスクをクロールする必要があります。

これを実行するより速い方法がありますが、それほど多くのディスクにヒットしませんか?高速であれば、完全に配布されたサンプルでなくても、正確に100個のアイテムを作成する必要はありません。

私はそれを考えています:

  • 多分私達は速いとiノードを使用することができますか?
  • ディスク上にあるものの全体を知らなくてもアイテムを選択できるのでしょうか?
  • おそらく、これを高速化できるいくつかのショートカットがあります。
+0

は、その多くの場合、ディレクトリの変更をしていますか?そうでない場合は、ファイルリストを別のファイルに保存し、ランダムサンプリングに使用します。 –

+0

@BrentWashburneそれはトンを変更することはありませんが、技術的な解決策が可能であれば、むしろ混乱を避けるでしょう。 – mlissner

+0

ファイル名はパターンに従っていますか?最初の文字が[a-z]の文字の場合、ランダムな文字を選択してグロブを開始し、ランダムに1つを選択することができます。 100ファイルに対して繰り返します。 –

答えて

0

globの代わりにos.listdirを使用してください。これは2倍の速さです。

import glob, random, os, time 

n, t = 0, time.time() 
files = sorted(glob.glob('tmp/*')) 
file_count = len(files) 
print(file_count) 
random_files = random.sample(range(0, file_count), 100) 
t = time.time() - t 
print "glob.glob: %.4fs, %d files found" % (t, file_count) 

n, t = 0, time.time() 
files = sorted(os.listdir("tmp/")) 
file_count = len(files) 
print(file_count) 
random_files = random.sample(range(0, file_count), 100) 
t = time.time() - t 
print "os.listdir: %.4fs, %d files found" % (t, file_count) 

出力

glob.glob: 0.6782s, 124729 files found 
os.listdir: 0.3183s, 124778 files found 

注意、あなたがランダムに移動するための方法であろうと、それらを生成することを可能にするファイル名に関するいくつかの情報があった場合。または、ファイルの名前をランダムサンプリングに適した形式に変更することもできます。

+0

ありがとう、私はこれを見てみるだろうが、おそらく 'listdir'にいくつかのオーバーヘッドを追加するglobbingが必要でした。 – mlissner

0

多分、私たちはinodeを高速で使うことができますか?

ないiノード、しかし、ディレクトリエントリ、あなたはドン; tは多分私達がディスク上にあるものの全体を知らなくても、項目を選択することができ、各ファイル

stat()を呼びたいですか?

はい、それは計画です。オープンディレクトリ、同様の呼び出しはPython 3.5に含まれるべきであるscandir、によって実行され、これはPythonでopendir()/readdir()通話

だろうCでのみ、ディレクトリエントリ、万人のうち、サンプル100とファイルを取得

を読みますRTL。そうでない場合、はOpenGroupドキュメントのWRT opendir()/readdir()https://github.com/benhoyt/scandir

UPDATE

リンクからそれを得る:http://pubs.opengroup.org/onlinepubs/009695399/functions/opendir.html

関連する問題