1

それぞれ最大約 20 個の特徴を含む、約 600 万レコードのスパース 2D データ セットがあります。これを 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)

最初の行の 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 に答える