在 CSV 中存储二维矩阵:java.lang.OutOfMemoryError
Store 2d matrix in CSV: java.lang.OutOfMemoryError
我编写了以下函数来计算成本矩阵并将其存储在 CSV 文件中:
private static void calculateCostMatrix()
{
int len = _POIs.size();
CostMatrix = new double[len][len];
for (int i=0; i<len; i++)
{
int ic = _POIs.get(i).getId();
for (int j=i; j<len; j++)
{
int jc = _POIs.get(j).getId();
double dist = euclideandist(_POIs.get(i).getLat(),_POIs.get(i).getLon(),
_POIs.get(j).getLat(),_POIs.get(j).getLon());
CostMatrix[ic][jc] = dist;
CostMatrix[jc][ic] = dist;
}
}
// Save in CSV
try
{
String NEW_LINE = System.getProperty("line.separator");
File file = new File("CostMatrix.csv");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
StringBuilder sb = new StringBuilder();;
for (double[] row : CostMatrix)
{
for (double d : row)
{
sb.append(d);
sb.append(",");
}
sb.append(NEW_LINE);
}
bw.write(sb.toString());
bw.close();
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
但是,很明显,由于元素数量很多 (200,000 x 200,000),我收到消息 java.lang.OutOfMemoryError: Java heap space
。
因此,我现在不想为 CostMAtrix 预先分配 space,而是直接计算每个单元格并将其存储在 CSV 文件中。
我怎样才能以正确的方式做到这一点?
我会做不同的事情。由于问题出在内存上,您可以使用磁盘上的临时二进制文件而不是数组来存储结果。创建这个大小合适的临时文件,然后通过它查找以存储双精度结果(以二进制形式)。
处理完整个二进制矩阵后,解析文件以将其转换为 CSV。
否则,您必须按值对 POI 进行排序,并将其索引保留为 CSV row/column 循环的参考。
我编写了以下函数来计算成本矩阵并将其存储在 CSV 文件中:
private static void calculateCostMatrix()
{
int len = _POIs.size();
CostMatrix = new double[len][len];
for (int i=0; i<len; i++)
{
int ic = _POIs.get(i).getId();
for (int j=i; j<len; j++)
{
int jc = _POIs.get(j).getId();
double dist = euclideandist(_POIs.get(i).getLat(),_POIs.get(i).getLon(),
_POIs.get(j).getLat(),_POIs.get(j).getLon());
CostMatrix[ic][jc] = dist;
CostMatrix[jc][ic] = dist;
}
}
// Save in CSV
try
{
String NEW_LINE = System.getProperty("line.separator");
File file = new File("CostMatrix.csv");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
StringBuilder sb = new StringBuilder();;
for (double[] row : CostMatrix)
{
for (double d : row)
{
sb.append(d);
sb.append(",");
}
sb.append(NEW_LINE);
}
bw.write(sb.toString());
bw.close();
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
但是,很明显,由于元素数量很多 (200,000 x 200,000),我收到消息 java.lang.OutOfMemoryError: Java heap space
。
因此,我现在不想为 CostMAtrix 预先分配 space,而是直接计算每个单元格并将其存储在 CSV 文件中。 我怎样才能以正确的方式做到这一点?
我会做不同的事情。由于问题出在内存上,您可以使用磁盘上的临时二进制文件而不是数组来存储结果。创建这个大小合适的临时文件,然后通过它查找以存储双精度结果(以二进制形式)。
处理完整个二进制矩阵后,解析文件以将其转换为 CSV。
否则,您必须按值对 POI 进行排序,并将其索引保留为 CSV row/column 循环的参考。