[英]GC overhead limit exceed when reading large file
我想逐行讀取我的 .csv 文件,以免自己一次將所有內容加載到 RAM 中。 我認為這是做到這一點的方式。 我還以在循環中不聲明變量的方式編寫代碼,以防止 JVM 總是創建新對象並運行垃圾收集器。
但是,我一直遇到這個“超出 GC 開銷限制”的錯誤。 我的 CPU 也幾乎 100% 運行。
這里的問題是由 HashMap 存儲數百萬個 String 對象引起的 - 但我的應該“只”存儲大約 20.000 個我的 Node 對象。
請幫我找到我的代碼有問題的部分。 錯誤報告下面源代碼中標記的行。
這是我的代碼:
HashMap<String,TweetNode> allNodes = new HashMap<String,TweetNode>();
// read file
try {
BufferedReader br = new BufferedReader(new FileReader(graphFile));
noOfNodes = 0;
String line = br.readLine();
String firstNode;
String[] lineContent;
while (line != null) {
lineContent = line.split("\t"); // error occurs here!
// always look at the first node
firstNode = lineContent[0];
if (! allNodes.containsKey(firstNode)) {
allNodes.put(firstNode, new TweetNode(noOfNodes, firstNode));
noOfNodes++;
}
allNodes.get(firstNode).addNeighbour(lineContent[1], Double.valueOf(lineContent[2]));
line = br.readLine();
}
br.close();
}
// ... catch stuff ...
return allNodes;
}
我在這里能看到的唯一問題是你的地圖。 Map 正在填滿堆內存。 您應該以低堆內存運行您的應用程序。 通過訪問以下參數檢查當前值並將它們設置為合理的高值。
標志 Xmx 指定 Java 虛擬機 (JVM) 的最大內存分配池,而 Xms 指定初始內存分配池。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.