实现在C#中存储稀疏数据的表的最有效方法是什么?

时间:2010-07-22 06:35:16

标签: sparse-matrix

我有一个存储非常稀疏数据的DataTable,例如:

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

行数和列数可能会超过10 ^ 8。

如何以更有效的方式存储这些数据?

3 个答案:

答案 0 :(得分:1)

如果您的磁盘文件系统支持Sparse files,您可以创建一个空文件,将其标记为稀疏,然后将其大小调整为rows * colums * datasize

然后是通过[row] [column]访问数据的问题,其中偏移量可以通过以下方式计算:

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

稀疏文件也存在一些开销,分配时通常会分配16-64kb的页面,但这取决于数据集群的工作方式。

答案 1 :(得分: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的内存。

希望这有帮助

答案 2 :(得分:0)

有效存储备用矩阵有很多prior art

一种常见的方法称为“列表清单”。例如,Python有一种以内存有效的方式将备用矩阵存储为“Row-based linked list sparse matrix”。