1

我有一个稀疏的 2D 数据集,其中包含大约 600 万条记录,每条记录最多包含大约 20 个特征。我想将其转换为只有零和一的非稀疏二维数据集,但我不断收到 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)

请注意,在第一行,第 2 列有一个 1,因为它在原始数据集中具有该特征,在第 4 行第 5 列和第 5 行第 2 列相同。

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

    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];

似乎它甚至无法处理那么大的数组?获得一个非稀疏矩阵至关重要。有没有办法解决这个内存错误?

亲切的问候,

4

1 回答 1

2

将阵列分配到更小、更易于管理的部分中,在对它们进行处理后使这些部分保持不变,然后根据需要再次查找它们。这里的问题是你不能一次将整个事情排序并处理到内存中。您正在处理大量数据,如果您想构建一个 6Mx6M 矩阵,那么再多的额外堆空间也无济于事。

于 2012-06-21T17:40:24.857 回答