在CSV中存储2d矩阵:java.lang.OutOfMemoryError

时间:2015-12-11 23:13:42

标签: 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; 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

因此,我现在想要直接计算并存储CSV文件中的每个单元格,而不是为CostMAtrix预先分配空间。 我怎样才能以正确的方式做到这一点?

1 个答案:

答案 0 :(得分:0)

我会以不同的方式做到这一点。由于问题是内存,您可以在磁盘上使用临时二进制文件而不是数组来存储结果。创建正确大小的临时文件,然后通过它来存储双重结果(以二进制形式)。

完成二进制处理整个矩阵后,解析文件将其转换为CSV格式。

否则,您必须按值对POI进行排序,并将其索引作为CSV行/列循环的参考。