我有一个稀疏的2D数据集,其中包含约600万条记录,每个记录最多包含约20个要素。
我想将其转换为仅包含零和一的非稀疏2D数据集,但我不断收到OutOfMemoryError。

这是我的数据集的示例:

1: 1723762 2737 2 283
2: 239 220 12 19237 2795
3: 3910 2931 86043 26354 349874 73736 2611 93921 4123830
4: 5
5: 4728 2
...(up to ~6mil)


我想将其转换为:

0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...(up to ~6mil)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
...(up to ~6mil)


请注意,在第一行上,第二列有一个1,因为它在原始数据集中具有该功能,在第四行的第五列和第五行的第二列相同。

我已经为此创建了一个代码,但是当我尝试以下操作时,它已经用完了内存:

    File data = new File("dataSet.txt");
    Scanner in = new Scanner(data);

    //check how many rows
    int nRows = 0;
    while (in.hasNextLine()) {
        in.nextLine();
        nRows++;
    }

    //initializing the matrix
    in.close();
    in = new Scanner(data);
    int[][] matrix = new int[nRows][nRows];


看来它甚至无法处理那么大的数组?获得非稀疏矩阵至关重要。有什么办法可以解决此内存错误?

亲切的问候,

最佳答案

在更小,更易于管理的部分中分配阵列,在对它们进行处理之后将其保留下来,然后根据需要再次查找它们。这里的问题是您无法立即将整个内容分类并处理到内存中。您正在处理大量数据,如果要构建6Mx6M矩阵,则没有任何额外的堆空间将对您有所帮助。

10-06 07:00
查看更多