Java 如何写入文件以避免OutOfMemory错误
下面的函数运行在java.lang.OutOfMemoryError中,不过我增加了项目的内存。 这发生在Java 如何写入文件以避免OutOfMemory错误,java,out-of-memory,Java,Out Of Memory,下面的函数运行在java.lang.OutOfMemoryError中,不过我增加了项目的内存。 这发生在sb.append(CostMatrix[k][j])行 我想原因是写入文件效率低下。与其将所有数据存储在CostMatrix中,不如逐行写入文件,每次更新sb。如何实现这一点 private static void saveDistanceMatricesToCSV(int i, List<Object[]> data) { System.out.println("Sa
sb.append(CostMatrix[k][j])行代码>
我想原因是写入文件效率低下。与其将所有数据存储在CostMatrix
中,不如逐行写入文件,每次更新sb
。如何实现这一点
private static void saveDistanceMatricesToCSV(int i, List<Object[]> data)
{
System.out.println("Saving distance matrix " + i + " to CSV");
try
{
String NEW_LINE = System.getProperty("line.separator");
File file = new File("clusters/d"+i+".csv");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
StringBuilder sb = new StringBuilder();
int len = data.size();
double[][] CostMatrix = new double[len][len];
for (int k=0; k<len; k++)
{
for (int j=k; j<len; j++)
{
double lat1 = (Float) data.get(k)[3];
double lon1 = (Float) data.get(k)[4];
double lat2 = (Float) data.get(j)[3];
double lon2 = (Float) data.get(j)[4];
double dist = distfunc(lat1,lon1,lat2,lon2);
CostMatrix[k][j] = dist;
CostMatrix[j][k] = dist;
}
}
for (int k=0; k<len; k++)
{
for (int j=0; j<len; j++)
{
sb.append(CostMatrix[k][j]);
sb.append(",");
}
sb.append(NEW_LINE);
}
bw.write(sb.toString());
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void savedistance矩阵tocsv(int i,列表数据)
{
System.out.println(“保存距离矩阵”+i+“到CSV”);
尝试
{
字符串NEW_LINE=System.getProperty(“LINE.separator”);
文件文件=新文件(“集群/d”+i+“.csv”);
FileWriter fw=新的FileWriter(file.getAbsoluteFile());
BufferedWriter bw=新的BufferedWriter(fw);
StringBuilder sb=新的StringBuilder();
int len=data.size();
双精度[][]成本矩阵=新双精度[len][len];
对于(int k=0;k您可以使用:
然后,不要附加到StringBuilder,只需打印到输出:
printWriter.println(NEW_LINE);
您可以使用:
然后,不要附加到StringBuilder,只需打印到输出:
printWriter.println(NEW_LINE);
我看到了各种低效的来源。您正在进行两对相同的for循环:
- 第一对:迭代数据结构并填充CostMatrix(顺便说一句,java变量名以小写开头)
- 第二对:迭代CostMatrix以填充StringBuilder
正如Berger已经告诉您的,您可以避免使用StringBuilder,但我也会删除第二对for循环,删除CostMatrix的内存使用,并在第一对循环中直接移动写入指令。我看到了各种低效的来源。您正在执行两对相同的for循环:
- 第一对:迭代数据结构并填充CostMatrix(顺便说一句,java变量名以小写开头)
- 第二对:迭代CostMatrix以填充StringBuilder
正如Berger已经告诉您的,您可以避免使用StringBuilder,但我也会删除第二对for循环,删除CostMatrix的内存使用,并在第一对循环中直接移动写入指令。您可以将每一行写入文件,如下所示
for (int k = 0; k < len; k++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < len; j++) {
sb.append(CostMatrix[k][j]).append(",");
}
output.write(sb.toString());
output.newLine();
}
for(int k=0;k
BufferWriter的换行符还使用系统属性line.separator。您可以将每一行写入文件,如下所示
for (int k = 0; k < len; k++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < len; j++) {
sb.append(CostMatrix[k][j]).append(",");
}
output.write(sb.toString());
output.newLine();
}
for(int k=0;k
BufferWriter的换行符也使用系统属性line.separator。谢谢。那么我应该如何处理CostMatrix?你是指pw.print(CostMatrix[k][j]);pw.print(“,”)?ungarida回答了这个问题,我想:)谢谢。那么我应该如何处理CostMatrix?你是指pw.print(CostMatrix[k][j]);pw.print(“,”);?ungarida确实回答了这个问题,我想:)在这种情况下唯一应该额外做的事情是使用for(int j=0;…)而不是for(int j=k;…)在这种情况下唯一应该额外做的事情是使用for(int j=0;…)而不是for(int j=k;…)