2012-12-12 173 views
5

我一直在研究一個Java程序,可以生成相當長一段時間的分形軌道。與照片相似,圖像越大,縮小時越好。該程序使用2D對象(Point)數組,當計算點的值時寫入該數組。也就是說Point存儲在它的對應值中,I.e .:Java堆硬盤驅動器

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

當然,這是爲簡單起見而編輯的。我可以將點值寫入CSV,稍後將它們應用於柵格,但使用類似的方法會產生不希望的結果。我嘗試了很長一段時間,因爲我喜歡能夠通過不使用此陣列而釋放空間來製作更大的圖像。它只是不會工作。爲了清晰起見,我想補充一點,Point對象也存儲顏色數據。

下一個問題是WriteableRaster,它與數組具有相同的尺寸。兩者結合起來佔據了很大的記憶。在嘗試改變其多次完成的方式之後,我已經接受了這一點,每種方法都有較低的質量結果。

在嘗試優化內存和時間之後,我得出結論,我真的受到RAM的限制。這是我想改變的。我知道-Xmx開關(設置爲10GB)。有沒有辦法使用Windows的虛擬內存來存儲光柵和/或陣列?我很清楚這會造成顯着的性能下降,但代替降低質量,似乎沒有多少選擇。

+1

我想你想看看[Berkeley DB](http://www.oracle。COM/technetwork /產品/ BerkeleyDB的/概要/持久性160890.html),尤其是基於註釋的持久性的POJO。 –

回答

2

操作系統已經在生產硬盤空間爲RAM爲你,當然每一個過程 - 沒有神奇的需要。這會比你想象的更糟糕的表現。它會很慢,以至於無法工作。

你在尋找內存映射文件嗎? http://docs.oracle.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

如果這真的要在內存中完成,我敢打賭你可以通過一些優化大幅降低內存使用量。例如,您的Point對象主要是開銷而不是數據。計算引用所需的字節數,然後爲Object開銷,與兩個ints相比較。

對於您的x和y座標,您可以使用兩個大平行int陣列將開銷降爲零。當然,你必須封裝這個代碼才能訪問。但是它可以將這個數據結構的內存使用量減半。數百萬的物體也加快了GC的運行速度。

而不是將WritableRaster放在內存中,可以考慮直接自己寫出一些簡單的圖像格式的圖像文件。 BMP可以非常簡單。然後可能使用外部工具來高效地轉換它。

嘗試-XX:+UseCompressedOops也可以減少對象開銷。另請嘗試-XX:NewRatio=20或更高版本,以使JVM爲長壽命對象預留幾乎所有的堆。這實際上可以讓你使用更多的堆。

+0

我沒有表現出它在我的例子,但Point對象也包含顏色數據。我很想挑選Point類來代替更小的東西;但是至少有三個(最大的)類需要幾乎完全重寫。在開始時糟糕的設計選擇。如果我重新編寫程序,我會解決這個問題。 你知道的方式直接寫入到一個JPEG?擺脫柵格將是一個天賜之物。如果沒有,我會寫入BMP。 JPEG的唯一原因是我試過的很多,最好的海量圖片調整器只接受JPEG文件。 – Fractalife

0

不建議配置JVM內存參數(Xmx)以使操作系統從其交換內存分配。顯然垃圾收集機制需要隨機訪問堆內存,如果沒有,程序將會長時間宕掉並可能鎖定。請已經給我的問題(最後一段)答案:

does large value for -Xmx postpone Garbage Collection