簡體   English   中英

讀取大文件時超出 GC 開銷限制

[英]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.

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