5

私はかなり前からフラクタル軌道を生成するJavaプログラムに取り組んできました。写真と同じように、画像が大きいほど、縮小したときの画像が良くなります。プログラムは、ポイントの値が計算されるときに書き込まれる2Dオブジェクト(ポイント)配列を使用します。つまり、ポイントは対応する値に格納されます。つまり、次のようになります。

Point p = new Point(25,30);
histogram[25][30] = p;

もちろん、これは簡単にするために編集されています。ポイント値をCSVに書き込んで、後でラスターに適用することもできますが、同様の方法を使用すると、望ましくない結果が生じます。この配列を持たないことで、スペースを空けてより大きな画像を作成できることを楽しんだので、かなり長い間試しました。それはうまくいきません。わかりやすくするために、Pointオブジェクトにはカラーデータも格納されることを付け加えておきます。

次の問題はWriteableRasterで、これは配列と同じ次元になります。この2つを組み合わせると、大量のメモリが消費されます。私はこれを受け入れるようになりました。それが何度か行われる方法を変えようとした後、それぞれがより低い品質の結果をもたらしました。

メモリと時間を最適化しようとした後、私は本当にRAMによって制限されているという結論に達しました。これが私が変えたいものです。-Xmxスイッチ(10GBに設定)を認識しています。Windowsの仮想メモリを使用してラスターや配列を保存する方法はありますか?これがパフォーマンスに大きな打撃を与えることはよく知っていますが、品質を下げる代わりに、実際には多くの選択肢がないようです。

4

2 に答える 2

3

OSはすでにあなたとすべてのプロセスのためにハードドライブスペースをRAMにしています-魔法は必要ありません。これは、あなたが思っているよりもパフォーマンスの障害になります。効果的に機能しないほど遅くなります。

メモリマップトファイルをお探しですか? http://docs.oracle.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

これが本当にメモリ内で行われるのであれば、最適化を行うことでメモリ使用量を劇的に減らすことができると思います。たとえば、Pointオブジェクトはほとんどがオーバーヘッドであり、データではありません。参照に必要なバイト数をカウントし、次にObjectオーバーヘッドに必要なバイト数を2つと比較してカウントしますints

intx座標とy座標に2つの大きな並列配列を使用すると、オーバーヘッドをゼロに減らすことができます。もちろん、コードにアクセスするには、これをカプセル化する必要があります。ただし、このデータ構造のメモリ使用量が半分になる可能性があります。オブジェクトが数百万少ないと、GCの実行も高速化されます。

メモリに入れる代わりにWritableRaster、画像ファイルを単純な画像形式で直接自分で書き出すことを検討してください。BMPは非常に単純です。次に、おそらく外部ツールを使用して効率的に変換します。

-XX:+UseCompressedOopsオブジェクトのオーバーヘッドも減らすようにしてください。また-XX:NewRatio=20、JVMが寿命の長いオブジェクト用にほぼすべてのヒープを予約するようにするか、それ以上を試みてください。これにより、実際により多くのヒープを使用できるようになります。

于 2012-12-12T09:47:23.863 に答える
0

オペレーティングシステムがスワップメモリ​​から割り当てるようにするために、JVMメモリパラメータ(Xmx)を設定することはお勧めしません。どうやらガベージコレクションメカニズムはヒープメモリにランダムアクセスする必要があり、そうでない場合、プログラムは長時間スラッシングし、場合によってはロックアップします。私の質問(最後の段落)にすでに与えられている答えを確認してください:

-Xmxはガベージコレクションを延期します

于 2012-12-12T09:38:29.023 に答える