2011-09-29 60 views
0

我從一個文件中整理大量整數,這可能太大而無法放入內存中,我目前的想法是使用快速排序來排序,然後將它們合併在一起。我想盡可能地讓這些塊儘可能大,所以我想知道我一次可以閱讀多少內容。搞清楚我可以在內存中創建的最大陣列

我知道Runtime.FreeMemory,但我應該如何去使用它。我應該仔細研究一下我在程序中使用的其他變量,然後創建一個大小的數組(freeMemory - variablesSizes),還是可能出錯?

謝謝!

+3

有所謂的「外部排序算法」。它們旨在對不適合RAM的數據進行排序。請參閱維基百科:http://en.wikipedia.org/wiki/External_sorting – jmg

+0

有關大約多少整數的任何提示? 100萬,10億,...... 1萬億? – claymore1977

+3

我會採取「什麼是過早優化?」 1000,亞歷克斯。 – Dave

回答

2

實驗,直到找到適合的尺寸。您可以在堆上分配的最大數組不一定是最快的方式。在很多情況下,整個堆不適合計算機RAM,可能會換成部分。僅僅因爲你可以分配一個巨大的數組,並不意味着它將成爲優化速度的最佳尺寸。

一些自適應方法可能是最好的(根據數組大小測試項目的數量/秒),並調整您可以適應什麼,而不會出現OutOfMemoryError。

更簡單:堅持一些運行良好的大值,但不一定是您可以使用的最大值。

或者:使用外部庫/數據庫來做你想做的事 - 處理大量的數據通常很困難,如果你不重新創建,你可能會獲得更好的性能和更短的開發時間。輪。

0

我會從第一個塊的塊大小開始。然後,我會將每個下一個塊的塊加倍,直到出現OutOfMemoryException。儘管這可能會引發交換。

0

我想搞清楚究竟我們多少內存可分配是一個棘手的樓內設有商務,因爲默認情況下在Java中的JVM將分配的一個256M的堆空間,但可以隨時使用-Xmx來increated,所以它是通過擁有固定的塊大小可以說約150M,最好的可交換性是可移植性的。

0

如果你使用java構建的排序功能,你將不得不使用某種類型的集合,它不會採用int基元類型,而是必須使用Integer對象。根據我的經驗(不能被視爲福音書),一個int在(明顯)4個字節的RAM中權衡,而Integer在32位機器上權重爲12個字節,在64位上權重爲24個字節機。

如果你需要儘量減少內存佔用,使用int [],然後實現自己的選機... 但是,它可能更容易周圍所有的方式來使用List<Integer>,以及內置的排序功能,只是處理不得不擁有更多更小的列表。

要回答這個問題,你應該看看這個問題的合併排序角度,並選擇一個任意列表大小開始。經過一番實驗,你可能會發現在列表大小和塊數之間存在折衷。找到最佳位置並告訴我們您的結果!

+2

['Arrays.sort(int [])'](http://download.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort%28int []%29)適用於原始數組。它也使用就地快速排序,因此基本沒有空間開銷。 – gustafc

+0

真棒,我一直忘記陣列類:)謝謝! – claymore1977