在CSV中存储2d矩阵:java.lang.OutOfMemoryError
我编写了以下函数,用于计算成本矩阵并将其存储在CSV文件中:在CSV中存储2d矩阵:java.lang.OutOfMemoryError,java,out-of-memory,Java,Out Of Memory,我编写了以下函数,用于计算成本矩阵并将其存储在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
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();
}
}
private static void calculateCostMatrix()
{
int len=_POIs.size();
CostMatrix=新双精度[len][len];
对于(int i=0;i我会采取不同的做法。因为问题是内存,所以可以使用磁盘上的临时二进制文件而不是数组来存储结果。创建大小合适的临时文件,然后通过它查找以存储双重结果(以二进制形式)
在二进制处理完整个矩阵后,解析文件以将其转换为CSV
否则,您将不得不按值对POI进行排序,并保留其索引作为CSV行/列循环的参考。谢谢。您可以提供一些示例的链接吗?此外,我需要在迭代计算中使用CostMatrix。因此,这意味着在计算CostMatrix并将其存储在CSV中之后,我需要以某种方式加载此文件作为一个循环从我的动态算法中访问CalthMatx[i] [j]。访问CSV文件是随机访问,本质上是非常缓慢和困难的。你应该考虑二进制文件作为最终结果并在这上面工作。好的。我也评估NeN4J,但我不确定。