2016-11-13 48 views
0

我正在解析來自Internet的一些數據以創建一個ArrayList,其中每個政治家類都有一個字段HashMap。每個HashMap將包含132 * 150條目。在第164個地圖填充後,我得到了這個異常:java.lang.OutOfMemoryError:Java堆空間。 我想使用序列化來存儲這個大列表,以便將來使用它。 我應該如何繼續?我應該序列化政治人員實例而不是整個列表?有沒有其他最佳的方式來存儲這些數據? (如果需要)我正在將這些數據寫入文件。我認爲將數據存儲爲「作爲對象」以提高易用性。 一些代碼:java.lang.OutOfMemoryError:Java堆空間創建Myclass的長列表

private static void setVotiParlamentari(ParserOpenParlamento parser, ArrayList<Politician> politicianList){ 
for(Politician p : politicianList){ 
    String filepath = System.getProperty("user.dir") + File.separator + "io_files" + File.separator + "info_parlamentari2"; 
    String filename = File.separator + p.getName() + ".txt"; 
    Iterator<String> votesIterator = parser.parsePoliticianVotes(p).iterator(); 
    FileWriter w = null; 
    try { 
     w = new FileWriter(filepath+filename); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    PrintWriter wr = new PrintWriter(new BufferedWriter(w)); 
    while (votesIterator.hasNext()){ 
     String vote = votesIterator.next(); 
     // i.e. for String vote = 35521:08/11/2016:Favorevole:SCCI-MAIE Favorevole:APPROVATA:391 
     String tokens[] = vote.split(parser.getSplittingChar()); 
     String idVote = tokens[0]; 
     String dateVot = tokens[1]; 
     String politicianVote = tokens[2]; 
     String groupVote = tokens[3]; 
     String result = tokens[4]; 
     String difference = tokens[5]; 
     wr.write(idVote+":"+dateVot+":"+politicianVote+":"+groupVote+":"+result+":"+difference+System.getProperty("line.separator")); 
     p.getVotazioni().put(Integer.parseInt(idVote), new Votazione(idVote, dateVot, politicianVote, groupVote, result, difference)); 
    } 
    wr.close(); 
} 

}

+0

如果你能顯示你的代碼的[mcve]會更好。 –

回答

1

如果你使用Eclipse IDE:

Run As - Run Configuration - Arguments - Vm Arguments點擊鼠標右鍵,然後加入這個(用於增加Java堆內存的大小,你也可以選擇其他值)

-Xmx2048m 

如果使用命令行,您添加到尾:

-Xmx2048 

2048是堆內存的最大容量,您還可以選擇其他值)

0

估計有多少內存Java程序所需要的,如果不是比你的記憶更多的PC,那麼你可以給更多的內存通過JVM Parameter您的程序,否則您需要change your algorithm

0
java -Xmx2048m <file-name>.jar 

-Xmx2048m是你的Java分配的堆大小,只是調整其大小根據需要

+0

謝謝,我會盡快嘗試這個解決方案。 (執行大約需要30小時) – canaio

+0

歡迎您 –

0

您正在使用大量String的對象,這將可能導致內存問題,所以我已經修改了代碼,如圖所示下面,將盡量減少堆空間的使用和更好的運行:

private static void setVotiParlamentari(ParserOpenParlamento parser, ArrayList<Politician> politicianList) { 

final String DELIMITER = ":"; 

for(Politician p : politicianList){ 
    String filepath = System.getProperty("user.dir") + File.separator + "io_files" + File.separator + "info_parlamentari2"; 
    String filename = File.separator + p.getName() + ".txt"; 
    Iterator<String> votesIterator = parser.parsePoliticianVotes(p).iterator(); 
    FileWriter w = null; 

    try { 
     w = new FileWriter(filepath+filename); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    PrintWriter wr = new PrintWriter(new BufferedWriter(w)); 

    StringBuffer sb = null; 
    String tokens[] = null; 
    String vote = null; 

    while (votesIterator.hasNext()){ 

     vote = votesIterator.next(); 
     // i.e. for String vote = 35521:08/11/2016:Favorevole:SCCI-MAIE Favorevole:APPROVATA:391 

     tokens[] = vote.split(parser.getSplittingChar()); 

     sb = new StringBuffer(); 
     sb.append(tokens[0]); 
     sb.append(DELIMITER); 
     sb.append(tokens[1]); 
     sb.append(DELIMITER); 
     sb.append(tokens[2]); 
     sb.append(DELIMITER); 
     sb.append(tokens[3]); 
     sb.append(DELIMITER); 
     sb.append(tokens[4]); 
     sb.append(DELIMITER); 
     sb.append(tokens[5]); 
     sb.append(System.getProperty("line.separator")); 

     wr.write(sb.toString()); 

     p.getVotazioni().put(Integer.parseInt(tokens[0]), new Votazione(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5])); 
    } 
    wr.close(); 
} 

伴隨着這一點,你可能需要增加JVM堆大小-Xmx2048m

相關問題