在處理google cluster2011資料集時,需要全部讀入500個檔案后,保存到list里,之后再進行處理,挑選自己需要的任務屬性,最后輸出到檔案中,目前的程式在讀入16個資料檔案時可以正常得到輸出檔案,但是超過16個檔案就會報以下錯誤:定位代碼后,感覺應該是split的使用問題,但是不知道如何解決,求助大家有沒有好的解決方案?
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.String.substring(String.java:1969)
at java.lang.String.split(String.java:2353)
at java.lang.String.split(String.java:2422)
at com.data.google.DataDao.getData(DataDao.java:35)
at com.data.google.Dataprocess.main(Dataprocess.java:16)
讀入檔案的代碼如下:
for(File file:list){
if(file.isFile()){
fileCount++;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line;
while((line = br.readLine())!=null){
String line1 = line;
String[] st = line1.split(",");
if(st.length >=12) {
Data d = new Data(st[0],st[2],st[3],st[5],st[9],st[10],st[11]);
if (null != line) {
ll.add(d);
line = null;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
uj5u.com熱心網友回復:
任何時候都不建議將所有資料都放在記憶體中,再多的記憶體也有撐爆的一天處理大資料的場景要使用流來處理
讀一個檔案處理一個檔案,一個檔案也不是全部讀入記憶體,可能是按行或者段來處理,這些東西都不建議放在List或者Map里面。
處理一部分,寫入檔案或者資料庫一部分。結果也不長時間在記憶體中保留,盡早持久化,釋放記憶體。
必要的時候需要調整演算法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/146544.html
標籤:Java相關
上一篇:java如何高性能網路爬蟲
下一篇:串行,并行和并發有什么區別?
