アプリケーションに問題があり、大量のメモリを最適化する必要がありますが、今のところ、アプリケーションのテストバージョンを提供する必要があります。実行可能ファイルなしでアプリケーションからAPIを呼び出すことができるため、「ramrush」のようなものが必要です。Ramrushは解決しています私の問題は魔法のようになりましたが、アプリで配信できません。
質問する
192 次
1 に答える
1
OPの差し迫ったニーズを解決するため(今日は少し遅れても)
画像処理コードには2つのレベルのメモリ最適化があります。
- より簡単なレベルでは、プログラマーは、不要になった画像オブジェクトをできるだけ頻繁かつ早期に(つまり、コードのすべての行の後で)削除しようとします。
- より難しいレベルでは、メモリ効率の高いパイプラインとしていくつかの画像処理ステップを実装する必要があります。
一例:
class RgbToGray : ImageSource
{
private ImageSource m_src;
public RgbToGray(ImageSource src)
{
m_src = src;
}
public void GetPixels(int x0, int y0, int rectWidth, int rectHeight, out Pixel[,] result)
{
// omitted: validate parameters
Pixel[,] temp = new Pixel[rectHeight, rectWidth];
m_src.GetPixels(x0, y0, rectWidth, rectHeight, out temp);
for (int y = y0; y < y0 + rectHeight; ++y)
{
for (int x = x0; x < x0 + rectWidth; ++x)
{
result[y,x] = SomeCalculation(temp[y,x]);
}
}
}
};
この例では、RgbToGray
は独自の永続的なメモリ使用量を必要とせずにオンデマンドで画像処理を実行しますが、代わりに一時バッファに依存します。この実装が機能GetPixels
するためには、メモリ節約効果を実現するために、呼び出し元は特定の「バッファ粒度」で呼び出す必要があります。これは、フルイメージサイズよりも小さくする必要があります。
(私が念頭に置いている特定のフレームワークはWindows Imaging Componentですが、 OpenCVのMatExpr
テンプレートなどの他の多くのフレームワークにも同様のアイデアがあります。)
どうやら、すべてのフレームワークがそのような最適化を許可しているわけではありません。
于 2012-08-25T04:54:02.877 に答える