簡體   English   中英

數據結構等同於大型數據集的map(在java中)

[英]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等,
  • 你使用Java 7,

您將自動受益於內置的小整數緩存。 如果整數假設范圍更廣,但仍有大量重復,則強烈建議使用自定義緩存。

除了更改jvms內存設置外,您還可以使用初始容量和負載平衡來調整HashMap的內存管理。

Javadoc摘錄:

HashMap的一個實例有兩個影響其性能的參數:初始容量和負載因子。 容量是哈希表中的桶數,初始容量只是創建哈希表時的容量。 加載因子是在自動增加容量之前允許哈希表獲取的完整程度的度量。 當哈希表中的條目數超過加載因子和當前容量的乘積時,哈希表將被重新哈希(即,重建內部數據結構),以便哈希表具有大約兩倍的桶數。

而不是創建一個HashMap

costs = new HashMap<Edge,Integer>();

您可以在Edge對象中存儲成本。

class Edge
{
    Vertex a;
    Vertex b;
    int cost;
}

這樣您就可以在系統中節省一些內存。

回到原來的問題:你有邊緣,有成本。 由於圖形稀疏,為什么不使用稀疏矩陣? 也許對象到整數的映射不是你真正需要和想要的。 你可以看看apache.commons.math,我認為他們有稀疏矩陣。 此外,您需要考慮如何訪問算法中的成本,選擇適當的稀疏格式(基於列的游程編碼/基於行的rle或其他)。 或者你不關心,並使用任何,但你應該在算法的開頭轉換東西。

你確實意識到這需要大量的RAM,對嗎? 嘗試增加堆大小 ,你會沒事的......

並回答你原來的問題:是的,這就是Map的用途......

您必須為每個項目指定項目所需的堆空間

我想你可以按照這一步:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM