[英]Data structure equivalent to map ( in java ) for large datasets
是否有一個已經實現的數據結構,我可以使用它來分配給一個對象(在我的情況下是一個Edge),一個整數? 我正在從一個文件,10密耳頂點,60密耳邊緣讀取圖形,並使用地圖(cost.put(e,cost))為每個邊緣分配成本。
我以這種方式創建成本圖:
costs = new HashMap<Edge,Integer>();
它給出的例外是:
java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(Unknown Source)
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
HashMap
是基本Map
的正確數據結構。 您遇到的問題是沒有指示JVM保留足夠的空間來將文件內容保存在內存中。 使用-Xmx
標志啟動JVM。 例如-Xmx1G
參數將允許它使用1千兆字節的內存。
你有6e7的邊緣。 普通對象占用24個字節(64位HotSpot),因此那里的1.44e9字節(1.5 GB)。 現在,您將介紹可以想象的最有效的地圖,僅添加6e7引用和6e7 Integer
對象。 這是refs的另一個2.4e8字節和Integer
s的1.44e9字節:另外1.5 GB,總數現在是3 GB - 這是你的問題的理論下限 (模緩存,見下文)。
基於此,我建議您使用另一個int
字段擴展Edge
類。 這將大大減少您的內存占用。
但是,如果這不是一個選項,並且:
new Integer
,但Integer.valueOf
,autoboxing等, 您將自動受益於內置的小整數緩存。 如果整數假設范圍更廣,但仍有大量重復,則強烈建議使用自定義緩存。
除了更改jvms內存設置外,您還可以使用初始容量和負載平衡來調整HashMap
的內存管理。
Javadoc摘錄:
HashMap的一個實例有兩個影響其性能的參數:初始容量和負載因子。 容量是哈希表中的桶數,初始容量只是創建哈希表時的容量。 加載因子是在自動增加容量之前允許哈希表獲取的完整程度的度量。 當哈希表中的條目數超過加載因子和當前容量的乘積時,哈希表將被重新哈希(即,重建內部數據結構),以便哈希表具有大約兩倍的桶數。
而不是創建一個HashMap
costs = new HashMap<Edge,Integer>();
您可以在Edge
對象中存儲成本。
class Edge
{
Vertex a;
Vertex b;
int cost;
}
這樣您就可以在系統中節省一些內存。
回到原來的問題:你有邊緣,有成本。 由於圖形稀疏,為什么不使用稀疏矩陣? 也許對象到整數的映射不是你真正需要和想要的。 你可以看看apache.commons.math,我認為他們有稀疏矩陣。 此外,您需要考慮如何訪問算法中的成本,選擇適當的稀疏格式(基於列的游程編碼/基於行的rle或其他)。 或者你不關心,並使用任何,但你應該在算法的開頭轉換東西。
您必須為每個項目指定項目所需的堆空間
我想你可以按照這一步:
Right mouse click - Run As - Run Configuration - Arguments - Vm Arguments, then add this -Xmx2048m
也許你正在尋找的是TObjectIntHashMap這類似於HashMap<Edge, Integer>
除了它將int
存儲為一個原語,可能會為你節省一些內存。 當集合更大時(因為它更適合緩存),此集合也可以稍微快一些
TObjectIntHashMap<Edge> costs = new TObjectIntHashMap<Edge>();
costs.put(e, cost); // cost is stored as a primitive not its wrapper object.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.