6

List<Image>約250枚の画像のフォルダからロードしています。DateTime 比較を行ったところ、250 個の画像を読み込むのに 11 秒かかりました。それは地獄のように遅いので、私はそれをスピードアップしたいと思っています.

画像は、外付けのハードドライブではなく、ローカルのハードドライブにあります。

コード:

DialogResult dr = imageFolderBrowser.ShowDialog();
if(dr == DialogResult.OK) {

    DateTime start = DateTime.Now;

    //Get all images in the folder and place them in a List<>
    files = Directory.GetFiles(imageFolderBrowser.SelectedPath);
    foreach(string file in files) {
        sourceImages.Add(Image.FromFile(file));
    }
    DateTime end = DateTime.Now;

    timeLabel.Text = end.Subtract(start).TotalMilliseconds.ToString();
}

編集: はい、すべての写真が必要です。私が計画しているのは、それぞれの中央の 30 ピクセル列を取り出し、そこから新しい画像を作成することです。360度の写真のようなものです。今だけ、ランダムな画像でテストしています。

これを行うには、おそらくもっと優れたフレームワークがあることは知っていますが、最初にこれを機能させる必要があります。

EDIT2: ストップウォッチに切り替えると、差はわずか数ミリ秒です。Directory.EnumerateFiles でも​​試してみましたが、まったく違いはありませんでした。

EDIT3: 32 ビットの Win7 クライアントで .NET 4 を実行しています。

4

6 に答える 6

3

実際にすべての画像をロードする必要がありますか? それらを遅延してロードすることで逃げることができますか? または、別のスレッドにロードできますか?

于 2010-10-28T20:28:19.537 に答える
2

Parallel.ForEach と一緒に Directory.EnumerateFiles を使用して、できるだけ多くの CPU に作業を分散させることができます。

var directory = "C:\\foo";
var files = Directory.EnumerateFiles(directory, "*.jpg");
var images = files.AsParallel().Select(file => Image.FromFile(file)).ToList();
于 2010-10-28T20:34:48.393 に答える
2

HDDアクセスとデコード速度を高速化することはできません。ただし、バックグラウンド スレッドで画像を読み込むことをお勧めします。

おそらく、画像が実際に読み込まれるまでプレースホルダーを表示することを検討する必要があります。

注意: 読み込んだ画像を UI スレッドに挿入する必要があります!

于 2010-10-28T20:29:29.757 に答える
1

イメージをロードすると、ファイル IO と CPU の両方の作業が行われるため、複数のスレッドを使用して速度を向上させる必要があります。

.net 4 を使用している場合は、タスクを使用するのが最適です。

于 2010-10-28T20:29:03.243 に答える
1

(ダイアログ ボックスから?) パスを既に知っている可能性が高いことを考えると、Directory.EnumerateFiles を使用して、リストの代わりに返されるコレクションを操作することをお勧めします。

http://msdn.microsoft.com/en-us/library/dd383458.aspx

[編集]

ループ内でファイルもアプリにロードしていることに気付きました-ファイルの大きさはどれくらいですか? サイズによっては、実際にはかなりの速度になる場合があります。

この時点でそれらをロードする必要がありますか? 表示コードを別の場所に変更して、オンデマンドで読み込むことはできますか?

于 2010-10-28T20:29:19.427 に答える
0

ボトルネックがファイル自体をディスクから読み取り、画像として解析しているため、速度を上げることはおそらくできません。

ただし、リストをロードした後にリストをキャッシュすると、その後のコードの呼び出しがはるかに高速になります。

于 2010-10-28T21:57:18.500 に答える