【问题标题】:pandas' memory usage for list of SparseSeriesPandas 对 SparseSeries 列表的内存使用情况
【发布时间】:2015-08-02 00:10:40
【问题描述】:

我正在尝试从稀疏的 numpy 矩阵创建 SparseSeries 列表。创建 lil_matrix 很快并且不会消耗大量内存(实际上我的维度更多的是数百万,即 1500 万个样本和 400 万个特征)。我已经阅读了之前的topic 。但这个解决方案似乎也耗尽了我所有的记忆,冻结了我的电脑。从表面上看,pandas 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))

【问题讨论】:

  • 似乎很稀疏:type(l[0]) Out[313]: pandas.sparse.series.SparseSeries

标签: python numpy pandas scipy


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2016-08-05
    • 2010-10-08
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多