2012-04-10 6 views
1

私は約100枚の画像(pngファイル)を合成する必要があります。 問題はそれらを組み合わせていないので、十分に速く実行されます。 ただし、ストレージから読み込むには最大4秒かかります。 これはあまりにも時間がかかります。c#.net、loading image

私はTPLまたは複数のスレッドを使用できますが、まだ遅すぎます。 どうすればスピードアップできますか?メインストレージ内のすべてのイメージを保持することは、残念なことにオプションではありません。

イメージが非常に小さい:4Kバイトから10KByte

に私は、画像をそのようにロードしています:

Image img = Image.FromFile(file); 
+0

画像の大きさはどれくらいですか? – Brian

+5

プロファイラを使用して実際にどこが遅いかを確認します。 I/Oだけでなく、他のコードも可能です。 (私はそのようなタスクのためにANTS Performance Profilerを使用しています) –

+0

あなたのハードウェアによって制限されているようなサウンド、Uweが提案したプロファイラを試してみてください。何も表示されない場合、速いHDD/SSDが必要です。 –

答えて

1

つのアイデア:

  • 遅れの大半は本当にIOからのものである場合、ファイルを圧縮します。それらの内容に応じて、簡単なZIP圧縮でさえ、サイズを小さくすることができます。作業はそれらをメモリ内で解凍することです。あなたのケースに該当するかどうかわかりません

  • 遅延ロードしてください。常に100枚の画像をすべて読み込む必要がありますか?おそらく最初に読み込んだもの、または最も重要なものを最初に読み込んで、残りの画像をバックグラウンドでロードする間にソフトウェアが他のものを実行させるようにしてください。

+1

彼らはPNGファイルのように見えるので、ZIP圧縮はどんな用途にも使用されることはありません。しかし、すべての画像が単一のZIPファイルに圧縮されていれば確かに役立つかもしれませんが、それは実現可能であるとは思えません。(マントンはおそらくソースデータをコントロールしていないでしょう。 –

+0

@LâmTranDuyPNGは軽く圧縮されていますが、圧縮されていれば内容が分かります。白い矩形を圧縮してみてください。私は、PNGのサイズの20%のZIPを取得します。 – MPelletier

+0

PNG形式は、ZIP形式で使用されるアルゴリズムである[LZ77圧縮アルゴリズム](http://en.wikipedia.org/wiki/LZ77)のバリエーションに依存しているため、面白いです。私はいくつかの特定のシナリオでこのような異なる結果を得るには、2つのアルゴリズムに十分なバリエーションがあると思います。 –

3

複数のスレッドを作成すると、あなたのケースでI/O速度を向上しません。それはあなたのハードディスクの読み書き速度に関するものです。

4秒で100枚の高品質画像を読み込むのは正常です。

+0

ファイルは本当に小:4KByteから10KByteまで。 – manton

+0

小さなファイルはディスク上で断片化しています。これは、シーク時間および回転遅延の原因となる可能性があります。シングルスレッドとマルチスレッドで実行するとどうなりますか?結果は変わるでしょうか? –

+0

場合によっては、継続時間が増加し、その他の場合には時間は小さくなりますが、それほど時間はかかりません。 – manton

0

イメージファイルをどのように読み込みますか?あなたのコードを共有してください。私の推測では、一度にファイル全体を読むのではなく、EOFまでバイト単位のようなものを読み込むことです...ファイルの読み込みを最適化する方法の1つは、ファイル全体をあらかじめ割り当てられたメモリバッファに読み込むことです。

+0

それはコードです:Image img = LoadImgFromFile(CurDirImg + imgNameAr [i]);あらかじめ割り当てられたメモリバッファとは何ですか?そして、それを.netでどのように使用できますか? – manton

+0

LoadImgFromFile().NET Frameworkメソッドではありません。あなたはその関数のソースコードを投稿できますか?また、なぜ標準のImage.FromFile()メソッドの代わりにそれを使用していますか? –

+0

@LâmTranDuy申し訳ありません。これはコードです:Image img = Image.FromFile(file); – manton