OutOfMemoryError:Java堆空间:试图转换约570万条记录数据集

OutOfMemoryError:Java堆空间:试图转换约570万条记录数据集,java,dataset,heap,space,Java,Dataset,Heap,Space,我有一个稀疏的2D数据集,大约有600万条记录,每条记录最多包含20个特征。 我想把它转换成一个只有0和1的非稀疏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

我有一个稀疏的2D数据集,大约有600万条记录,每条记录最多包含20个特征。 我想把它转换成一个只有0和1的非稀疏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矩阵,那么任何额外的堆空间都无法帮助您

6mil x 6mil==36万亿。即使只是比特数,也只有约4.5TB的数据。你根本没有一个地址空间接近那么大,所以你需要找到一种通过内存“流”数据的方法。另外,我想我有点困惑,为什么你绝对需要非稀疏矩阵。您执行的任何计算都可以抽象,这样您就不需要设置物理位。我假设这也不是为了打印:)可能尝试不将所有数据都保留在缓存中,并寻找外部方法来持久化它不确定您要做什么,但看起来行是未排序的。也许对它们进行分类就足够了,以便在您所做的工作中获得更好的性能?将给你日志(n)访问任何功能与二进制搜索。。。如果n被限制为20,那应该不会太糟糕。你到底想要达到什么目标?也许你可以考虑使用一个为大数据设计的平台(如Hadoop)将其转换成解决方案。