我有一个来自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时复制稀疏矩阵?