我正在从互联网上解析一些数据以创建一个arraylist,其中每个Politician类都有一个字段HashMap。每个HashMap都包含132 * 150条目。填充第164个映射后,我遇到了这个异常:java.lang.OutOfMemoryError:Java堆空间。 我想使用序列化来存储这个大的列表,以便将来使用它。 我该怎么办?我应该序列化政治家实例而不是整个列表吗?是否有其他最佳方式来存储这些数据? (如果需要)我也将这些数据写入文件。我认为将数据存储为“对象”以提高易用性。 一些代码:
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 :(得分:1)
如果您使用Eclipse IDE:
单击鼠标右键
Run As - Run Configuration - Arguments - Vm Arguments
,然后添加此项(对于增量Java堆内存大小,您还可以选择其他值)
-Xmx2048m
如果您使用命令行,则添加到尾部:
-Xmx2048
(2048
是堆内存的最大大小,你也可以选择其他值)
答案 1 :(得分:0)
估计你的java程序需要多少内存,如果它不超过你的PC内存那么你可以通过JVM Parameter
为你的程序提供更多的内存,否则你需要change your algorithm
。< / p>
答案 2 :(得分:0)
java -Xmx2048m <file-name>.jar
-Xmx2048m
是您为java分配的堆大小,只需根据需要调整大小
答案 3 :(得分: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