pandas对SparseSeries列表的内存使用情况

时间:2015-05-20 16:03:32

标签: python numpy pandas scipy

我正在尝试从稀疏的numpy矩阵创建SparseSeries列表。创建lil_matrix很快并且不会占用大量内存(实际上我的维度大约为数百万,即1500万个样本和400万个特征)。我已经阅读了之前的topic。但是这个解决方案似乎也耗尽了我的所有记忆,冻结了我的电脑。在表面看起来像大熊猫SparseSeries不是真的稀疏,或者我做错了什么?最终目标是从中创建一个SparseDataFrame(就像我提到的其他主题一样)。

from scipy.sparse import lil_matrix, csr_matrix
from numpy import random
import pandas as pd

nsamples = 10**5
nfeatures = 10**4
rm = lil_matrix((nsamples,nfeatures))
for i in xrange(nsamples):
  index = random.randint(0,nfeatures,size=4)
  rm[i,index] = 1 

l=[]
for i in xrange(nsamples):
  l.append(pd.Series(rm[i,:].toarray().ravel()).to_sparse(fill_value=0))

1 个答案:

答案 0 :(得分:1)

由于您的目标是稀疏数据帧,我跳过Series阶段并直接进入数据帧。我只有耐心才能在较小的阵列尺寸上做到这一点:

nsamples = 10**3 
nfeatures = 10**2

创建rm是一样的,但我不会加载到列表中,而是执行此操作:

df = pd.DataFrame(rm[1,:].toarray().ravel()).to_sparse(0)
for i in xrange(1,nsamples):
    df[i] = rm[i,:].toarray().ravel()

遗憾的是,这比你拥有的要慢得多,但结果是数据框,而不是列表。我玩了一下这一点,我可以告诉你,没有任何快速的方法可以逐列构建一个大的,稀疏的数据帧(甚至是一个完整的零),而不是一次性完成(这不会是内存)有效)。我可以找到的文档中的所有示例都以密集结构开始,然后一步转换为稀疏。

无论如何,这种方式应该通过一次压缩一列来实现内存效率,这样你就不会同时解压缩整个数组/数据帧。结果数据帧肯定是稀疏的:

In [39]: type(df)
Out[39]: pandas.sparse.frame.SparseDataFrame

并且绝对节省空间(几乎25倍压缩):

In [40]: df.memory_usage().sum()
Out[40]: 31528

In [41]: df.to_dense().memory_usage().sum()
Out[41]: 800000