2012-04-09 16 views
1

私は、年月に分割されたサブフォルダ内に200万のファイルを分散しています。 私が使用してファイルをループしています:サブフォルダのEnumerateFilesメモリ効率

foreach (string year_folder in Directory.EnumerateDirectories(data_path)) 
    foreach (string month_folder in Directory.EnumerateDirectories(year_folder)) 
     foreach (string file in Directory.EnumerateFiles(month_folder)) 

は、より多くのメモリ効率的である:

foreach (string file in Directory.EnumerateFiles(data_path, "*.*", SearchOption.AllDirectories)) 

iは、ネストされた構文を使用して設定列挙パーティショニングすることを期待できますか?

下記の私のコメントもご覧ください。

+0

私が流暢なSystem.IOラッパーにこれを追加するより効率的な方法を見つけたら、本当にこの結果を聞きたいと思っています。 –

+1

両方を試してみてください。両方のケースで書かれたコードを持っているので、それぞれを実行してプロファイルすれば確実に分かります。たとえ他の人がより良い理論を作っても、どれくらい*良いかを理論化することはむしろ困難です。むしろその差はあまり重要ではないほど小さいであろう。 – Servy

+0

私が理解しようとしているのは、ループが最後の要素(2番目のアプローチを正当化する)を繰り返すまで、またはループ中にガベージコレクションが頻繁に行われるまで、IEnumerableセットがメモリを占有するかどうかです) – eyaler

答えて

1

ユアーズは若干小さくなっている

あなたはハード最初の二つは、ディレクトリがあることを、ちょうど3つの入れ子のレベルがあるという事実をコーディングすることができる唯一のため、場合でも、あなたの提案された解決策は、わずかより多くのメモリ効率的になりますファイルのみが含まれています。

かれらが一方

やや一般的であり、Directory.EnumerateFiles()は、それがである場合を追跡するための独自の内部スタックを含むであろうネスト任意のディレクトリ(と一般的なケースのためのソリューションを実装する必要があります列挙)。

どちらか1の罰金、ここでのトレードオフがある

あなたの実装では、現在、特定のディレクトリ構造にあなたのコードをバインドします。私はちょっとのようにはあなたのforeachループを見て、ディスク上で見つけることが期待されるフォルダ構造を視覚化することができます。

一方、あなたやチームの誰かがディレクトリレイアウトを変更したい場合、それは迷惑になります。 ディレクトリ構造を変更する場合は、コードを変更することが非常に簡単であるか、コードを更新するだけの簡単な方法であれば、あなたのアプローチを使用しても安全です。

関連する問題