簡體   English   中英

熊貓的內存使用情況以用於SparseSeries列表

[英]pandas' memory usage for list of SparseSeries

我正在嘗試從稀疏的numpy矩陣創建SparseSeries的列表。 創建lil_matrix的速度很快,並且不會占用大量內存(實際上,我的維數大約是數百萬,即1500萬個樣本和400萬個特征)。 我已經閱讀了上一個主題 但是該解決方案似乎也耗盡了我的全部內存,凍結了我的計算機。 從表面上看,熊貓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))

由於您的目標是稀疏數據框,因此我跳過了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM