高效的hstack稀疏矩阵方法

时间:2018-06-12 13:18:02

标签: python out-of-memory sparse-matrix

我有一个来自TfidfVectorizer的uni-和bigram计数的大型稀疏矩阵(大约1亿行乘以1000+列)。我想在我的数据集中添加更多列,但我似乎经常遇到没有足够RAM的问题。

我发现问题是当我尝试使用包含新特征的稀疏矩阵来隐藏整个ngram特征稀疏矩阵时。

以下是堆叠它们的代码。

ngram_features = csr_matrix(vectorizer.transform(df["domain"]))
new_features = csr_matrix(df[added_features].values)
features = hstack((ngram_features, new_features))

这会导致MemoryError,或者有时甚至会在被杀死的过程中结束。我查看了scipy.sparse.hstack的代码,虽然我不是专家,但似乎是代码always makes a copy of the sparse matrices。由于我的稀疏矩阵的大小已经接近我的计算机可以处理的极限,我试图通过逐步添加新列来找到降低内存压力的方法。

chunksize = 1000000
nbr_loops = (ngram_features.shape[0] // chunksize) + 1
for i in range(nbr_loops):
    ngram_features_chunk = ngram_features[i * chunksize:(i + 1) * chunksize, :]
    new_features_chunk = new_features[i * chunksize:(i + 1) * chunksize, :]

    features_chunk = hstack((ngram_features_chunk, new_features_chunk))
    del ngram_features_chunk
    del new_features_chunk

    try:
        features
    except NameError:
        features = features_chunk.copy()
    else:
        features = vstack((features, features_chunk))

del ngram_features
del new_features

但是,这也会以杀死进程结束。

当我想要将列添加到已经很大的稀疏矩阵时,是否有任何有效的方法来减少RAM上的压力,或者至少避免在我执行hstack时复制稀疏矩阵?

0 个答案:

没有答案