5

私は、実際に黒い背景に画像を保持する 2D float 配列 (float[][] 配列) を集中的に操作する Java アプリケーションを持っています。どちらの次元も等しく (正方形)、2 のべき乗 (ほとんどは 256、512、1024) であるため、境界に近い領域はほとんどの場合ゼロになります。

パフォーマンスを向上させ (FFT がいくつかあります)、回転などの配列に対する操作の複雑さを軽減するために、サイズを 2 のべき乗に等しくします。最近、6Gb のマシンでこのアプリケーションのヒープ不足に直面しました。私の計算では、このアプリケーションのメモリ消費量は最大 2 ~ 3Gb である必要がありますが、4 ~ 5Gb に達します (Windows タスク マネージャーで確認)。「YourKit」プロファイラーを使用したところ、これらの float 配列が実際に最も多くのメモリを消費することが示されていますが、これらの float 配列の合計サイズはおよそ 1.3Gb になるはずです (データの保存方法を決定するのは JVM 次第であることはわかっていますが、メモリ消費量が 2 ~ 3 倍になるとは予想していませんでした)。

その場でSnappyコンプレッサーを使用してデータを圧縮/解凍しようとしましたが(メモリ消費量は3.5Gbに低下しました)、パフォーマンスが数回低下し、あまり受け入れられません. また、これらの float[][] を BufferedImage に置き換えたときのパフォーマンスをテストしていましたが、パフォーマンスは非常に悪かったです。

したがって、メモリ消費量を減らすために機能する2つの方法が残っています。1)「ゼロ」要素を節約するために、float [] []配列のラッパーを記述します(「空の」行と列がたくさんあります)2 ) 「2 のべき乗」から離れる

どちらの方法でも、かなりのコーディング/リファクタリングが必要になるため、「あるべきかどうか」を考えている間、この問題についてより良い手がかりがあるかもしれません。

ありがとう!

4

2 に答える 2