【问题标题】:some issus about dok_matrix for sparse storeage关于稀疏存储的 dok_matrix 的一些问题
【发布时间】:2019-07-22 12:12:57
【问题描述】:

现在我有 8000 万行,60 万列,5 亿个值是非零的。它很稀疏。我选择 scipy api dok_matrix 来存储它。使用 dok_matrix 时的内存是多少,看起来是不仅存储非零值。

我有 5 亿个非零值,但内存不足,为什么?

a = ss.dok_matrix((8000000,600000))

dict1={}
dict2={}
index1=0
index2=0
for line in open("./data"):
        line = line.strip()
        fields = line.split("\t")
        if len(fields)<3:
                continue
        key1 = fields[0]
        key2 = fields[1]
        value = float(fields[2])
        if key1 not in dict1:
                dict1[key1] = index1
                index1 += 1
        if key2 not in dict2:
                dict2[key2] = index2
                index2 += 1
        a[dict1[key1],dict2[key2]] = value
        print ("ok")


b = a.getrow(0).items()
for i in b:
        print (i[0][1],i[1])

在我看来,它只需要非零,100 亿 =1G,所以它不应该 oom。对于这种情况,我如何存储大的稀疏特征?

【问题讨论】:

  • dok 是 python dict 的子类。这不是一个紧凑的内存高效存储。

标签: python numpy scipy sparse-matrix


【解决方案1】:

我会把你的数字作为给定的。您将矩阵构造为,

a = ss.dok_matrix((8000000,600000))

这个defaults to dtype='d',一个双精度浮点数。我将假设这需要 64 位内存来表示(我认为这是一个合理的假设)。一个字典键矩阵也必须为每个非零值存储一个索引,其中你有大约 5 亿个。这意味着我们至少为行和列索引存储另外两个整数。为简单起见,假设它们也采用 64 位表示。

这导致每个非零条目占用一些3 * 64 = 192 位内存或24 个字节的结论。在 5 亿条记录中,加起来有一些 500 * 10 ** 6 * 24 = 12 * 10 ** 9 字节,或者总共不到 12GB。根据您的机器,这可能会超出可用的范围。

根据您要对该矩阵执行的操作,您可以将行作为批处理加载,一次处理几百万行。这是一个常见的场景,例如训练模型,因为大多数机器无法一次将整个数据集全部放入内存。有关更多信息,您可以查看here

【讨论】:

    【解决方案2】:

    带有您的 sepifications 的 csr 格式矩阵将需要:

    8000001 int64 array for the indptr attribute
    500,000,000 int64 array for the indices attribute
    500,000,000 int64 or float64 (possibly 32 instead) for the data attribute
    

    创建此类矩阵的常用方法是使用coo 格式,其中row 属性的大小为500,000,000(而不是indptr)。

    您可以使用 list apppend 构造这些数组:

    row.append(key1)
    col.append(key2)
    data.append(value)
    

    np.array(row) 等会比列表更紧凑,但不利于迭代构造。

    测试是否可以制作这样一个矩阵的快速方法是:

    M = sparse.random(8000000,600000, .0001, 'csr')
    

    那是用这些维度制作一个随机的 csr 矩阵,并且稀疏地大致生成 5 亿个非零值。

    【讨论】:

    • 怎么就死机了。机器内存128GB,100亿才1G,为什么会这样>
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多