2017-01-18 4 views
0

私は3万のPDFファイルでフォルダを持っています(理由は問いません)。C# - 30,000のPDFファイルのフォルダをループする最も速い方法

私はそれらをループし、Windowsフォームの日付ピッカーコントロールで選択された日付の値と日付を一致させる必要があります。私は、リスト内のファイルを持っている後、私はその後、他のさまざまな処理のために別の場所に移動

public List<FileInfo> myList = new List<FileInfo>(); 
     DirectoryInfo di = new DirectoryInfo(@"\\PDFs"); 

myList = (di.EnumerateFiles("*.pdf").Where(x => x.LastWriteTime.Date == datetime.Date).ToList()); 

が、私は間違いなくスピードアップしたいの側面は、この次のとおりです。ここで

は私が持っているものです部。

これはむしろ遅いですが、これをスピードアップするにはどうしますか?

ありがとうございました。 PowerShellはオプション(と私はそれをお勧めします)であれば

+0

これでpowershellを使用してみましたか?それともオプションではないのですか? – Nils

+2

フォルダに30,000個のPDFファイルがあるのはなぜですか? – dfundako

+1

どのようにあなたの遅さはどこですか?コード上でプロファイラを実行して、時間がどこに費やされたのかを確認しましたか?または後で 'myList'で何かするのですか?それは本当の遅さです。 –

答えて

-2

は、これを試してみてください。

Get-ChildItem c:\folder | Where{$_.LastWriteTime -gt (Get-Date).AddDays(-7)} 

は、Get-日は今日返されますので、上記の最後の7日間に変更されたすべてのファイルを、返します。 。

+1

この情報でOPが何をしているのかわからないときに、PowerShellをどのようにお勧めできますか? –

-1

ファイル(myList)のリスト全体が作成されるのを待つ必要はありません。最初の列挙ファイルの後で処理を開始できます。 Parallel.ForEachを使用して、1つのファイルをダウンロードして処理してください。以下の例では、結果を格納するためにConcurrentBagコレクションを使用しています。

var results = new ConcurrentBag<ProcessingResult>(); 

var files = di.EnumerateFiles("*.pdf").Where(x => x.LastWriteTime.Date == datetime.Date); 
Parallel.ForEach(files, file => { 
    var newLocation = CopyToNewLocation(file); 
    var processingResult = ExecuteAditionalProcessing(newLocation); 

    results.Add(processingResult); 
}); 
+1

'Parallel.For'は、CPUバインドされたタスクをより速く処理することを可能にしますが、IOバインドのパフォーマンスを向上させません(場合によっては逆の効果をもたらすこともあります) - http://stackoverflow.com/questions/868568/what -do-the-terms-cpu-bound-and-io-bound-meanである。だからあなたは本当に問題がCPUに縛られていると思っていますが、グロブマッチングを使った30000ファイルの列挙はボトルネックになることはありませんか?私はできるだけ早くファイルを処理することが適切なアプローチだと思っていますが、実際に処理する前に** OPはすべてのアイテムを**持っているようです。 –

関連する問題