Python 熊猫';SparsSeries列表的内存使用情况

Python 熊猫';SparsSeries列表的内存使用情况,python,numpy,pandas,scipy,Python,Numpy,Pandas,Scipy,我试图从稀疏numpy矩阵创建一个稀疏序列列表。创建lil_矩阵的速度很快,并且不会消耗大量内存(实际上,我的维度大约是数百万,即1500万个样本和400万个特征)。我以前读过一篇关于这方面的文章。但这个解决方案似乎也耗尽了我所有的内存,冻结了我的电脑。从表面上看,熊猫稀疏系列并不是真的稀疏,还是我做错了什么?最终目标是从中创建一个SparFrame(就像我提到的其他主题一样) 因为您的目标是稀疏数据帧,所以我跳过了系列阶段,直接进入了数据帧。我只有耐心在较小的数组大小上执行此操作: nsamp

我试图从稀疏numpy矩阵创建一个稀疏序列列表。创建lil_矩阵的速度很快,并且不会消耗大量内存(实际上,我的维度大约是数百万,即1500万个样本和400万个特征)。我以前读过一篇关于这方面的文章。但这个解决方案似乎也耗尽了我所有的内存,冻结了我的电脑。从表面上看,熊猫稀疏系列并不是真的稀疏,还是我做错了什么?最终目标是从中创建一个SparFrame(就像我提到的其他主题一样)


因为您的目标是稀疏数据帧,所以我跳过了
系列
阶段,直接进入了数据帧。我只有耐心在较小的数组大小上执行此操作:

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倍的压缩):


它似乎是稀疏的:
type(l[0])Out[313]:pandas.sparse.series.SparseSeries
In [39]: type(df)
Out[39]: pandas.sparse.frame.SparseDataFrame
In [40]: df.memory_usage().sum()
Out[40]: 31528

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