2

次のような非常にまばらなデータを格納する DataTable があります。

   P1 P2 P3 P4 P5 ...
J1 1  1
J2    1  1
J3             1
.
.
.

行数と列数が 10^8 を超える場合があります。

このデータをより効率的な方法で保存するにはどうすればよいですか?

4

3 に答える 3

1

ディスク ファイル システムがスパース ファイルをサポートしている場合は、空のファイルを作成し、スパースとしてマークしてから、サイズを に変更できrows * colums * datasizeます。

次に、[row][column] でデータにアクセスする問題です。オフセットは次のように計算できます。

offset = ((columns.length * (row-1)) + column) * datasize

スパース ファイルには、通常 16 ~ 64kb のページが割り当てられる割り当てに関してもオーバーヘッドがありますが、データ クラスターの方法によっては、非常にうまく機能する場合があります。

于 2010-07-22T08:15:54.457 に答える
0

予備行列を効率的に格納することについては、多くの先行技術があります。

一般的なアプローチは「リストのリスト」として知られています。たとえば、Python には、予備行列を「行ベースの連結リスト疎行列」として格納するメモリ効率の良い方法があります。

于 2012-07-08T12:50:39.210 に答える
0

まず、これらのデータ数の DataTable を取り除きます。ここでのメモリ使用量は膨大です。

データが常に 0/1 の場合、最も効率的な方法はビット マスクです。

データが 0/1 だけでない場合は、すべての列を抽象化する構造を作成します。

これは、そのデータ構造の概念的なプロトタイプです。

class MyData {
    public MyData(int[] columns, object[] data) {
        _columns = columns;
        _data = data;
    }

    int[] _columns;
    object[] _data;

    public object this[int column] {
        get {
            int index = IndexOf(column);
            return index != -1 ? _data[index] : null;
        }
    }

    private int IndexOf(int column) {
        for (int i = 0; i < _columns.Length; i++)
            if (_columns[i] == column)
                return i;
        return -1;
    }
}

flyweight パターンを適用することで、_columns のメモリをさらに節約できます。

お役に立てれば

于 2010-07-22T06:47:02.510 に答える