3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
Java里一般是傳遞引用,
而Map容器里,value也是保存的是引用,也就是一個(gè)指針。
Map本身的內(nèi)存占用其實(shí)不是很大。
內(nèi)存占用情況要按 指針指向的實(shí)例進(jìn)行統(tǒng)計(jì)。
也就是那些數(shù)據(jù)的大小統(tǒng)計(jì)。
因?yàn)镸ap是一個(gè)值保存對(duì)象,讓Map負(fù)責(zé)保存數(shù)據(jù)是不合理的設(shè)計(jì)。
相反應(yīng)該在 向Map對(duì)象寫入數(shù)據(jù)的地方添加檢查邏輯。
比如
void readData(SomeReader reader) {
Map<String, Object> datamap = new HashMap<String, Object>();
while (null != (Object data = reader.read()) {
String key = extractKey(data);
datamap.put(key, data);
if (datamap.size()>10000) {
storeAndClearMap(datamap);
}
}
}

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
apache commons 的org.apache.commons.collections.map.LRUMap可以解決內(nèi)存溢出,寫到文件這段功能,自己利用LRUMap重寫下

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
我說一個(gè)思路哈。
你可以自己定義一個(gè)put方法,在你的put方法里面首先判斷map的size,每次到了i%100==0的時(shí)候就輸出到文件,然后將map置為null,繼續(xù)往里面添加數(shù)據(jù),然后最后再把剩下的都輸出,類似
myPut(data) {
if(map.size%100==0) {
flushToFile();
}
map.put(data);
}
添加回答
舉報(bào)