1

ディスクから何百もの画像を読み取り、それらを処理して単一の画像を生成するグラフィックプロセスを最適化しようとしています。最適化しようとしているプロセスは、ディスクから画像を何度も読み取ることであり、検討しているオプションの 1 つです。メモリ内の画像を読み込んでキャッシュしています。最も単純な形式では、次のように辞書を使用したいと考えています。

アップデート:

  • ディスク上のイメージは変更されません
  • 最終アクセスのタイム スタンプを使用して、使用頻度の低いアイテムをキャッシュから期限切れにするプロセスがあります。
  • 今のところ、シングル スレッド プロセスです。
  • 平均画像サイズは約400KB
  • 物理メモリサイズは16GB

これは良いアイデアですか?, 最も重要なことは、うまくいくでしょうか?

public class ImageCache
{
    protected Dictionary<string, System.Drawing.Image> ImageStore = new   Dictionary<string, System.Drawing.Image>(10000);




 public System.Drawing.Image Get(ImageReference imgRef)
 {
      System.Drawing.Image image;

        if (!ImageStore.TryGetValue(imgRef.Key, out image))
           image= CacheImageFromDisk(imageRef);
       return image;
 }

 System.Drawing.Image CacheImageFromDisk(ImageReference imgRef)
    {
      using (var f = new FileStream(imgRef.Path, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            var img=Image.FromStream(f);
            ImageStore.Add(imgRef.Key,img);
            return img;
        }
  }

    ~ImageCache()
    {
       //Dispose each item in ImageStore  and calll GC.Collect()
    }
}
4

4 に答える 4

1

それは私にとって良い考えであり、一見コードは機能しているように見えます。とにかく考えてください:

  • スレッドセーフ:画像で複数のスレッドが機能している場合、現時点では、chacheはスレッドセーフではありません。
  • メモリ消費:画像はメモリを消費することがあります。これによりプロセスに悪影響が及ぶ可能性があることに注意してください。また、メモリの交換によりパフォーマンスが低下する可能性もあります。この場合、プログラムはキャッシュをオンにするよりも遅く感じます。
于 2012-12-07T15:35:02.673 に答える
0

最も重要なことは、それは機能しますか?

出来た。

これは良い考えですか?

それは、再利用する複製/画像がいくつあるかによって異なります。キャッシングは、メモリとパフォーマンスのトレードオフです。これがアプリのボトルネックである場合は、大幅なスピードアップが得られる場所を確認する必要があります (IO はプロファイリングが難しい傾向があります)。

于 2012-12-07T15:38:29.800 に答える
0

気になるのはメモリです。
メモリがいっぱいになると、ディスク IO に戻ります。
ビルドしている単一のイメージとすべてのソース ファイルに対して十分なメモリがありますか。
ビルドしている単一のイメージをディスクにページアウトし始めると、パフォーマンスが低下する可能性があります。

最適化については、ファイルに戻る理由を見てください。
一度に 1 つのソース ファイルを使用するプロセスを合理化して、それで完了できますか。
または、少なくともソース ファイルのブロックを処理して、それらを処理できますか。

辞書は、セットを管理する適切な方法です。
しかし、有効期限は、サイズを管理するためのあまり洗練された方法ではありません。
使用されているメモリに基づいて辞書をクリアする必要があります。
アプリがディスクへのページングを開始した場合、それは悪いことです。

最適なメモリ サイズについては、パフォーマンス カウンターを使用し、ページ ファイルの使用状況を追跡します。
ただし、ページングが発生するため、ゼロはターゲットではありません。
私の経験では、MSSQL はメモリを最大まで使用し、そこに保持します (制約しない限り)。あなたのアプリは 80% でページアウトを開始します。
標準の % はありません。

ファイルをいつ使用し、どの時点でファイルを処理するかについて、アプリをよりスマートにできないでしょうか? に戻ります。

すべてをメモリに収めることができない場合は、費用対効果が最も高いのはソリッド ステート ディスクです。

于 2012-12-07T15:43:18.857 に答える
0

画像をプライマリ メモリにキャッシュすることは非常に悪い考えだと思います。メモリが使い果たされ、システム全体の安定性に問題が生じる可能性さえあります。高解像度の画像は約 20 MB になる可能性があります。何枚キャッシュしますか? ?

于 2012-12-07T15:49:45.180 に答える