簡體   English   中英

熊貓數據框內存read_csv

[英]Pandas Dataframe memory read_csv

以下是三個屏幕截圖。 前兩個簡單地通過輸入將csv讀取到數據幀的命令( pandas.read_csv )來顯示空閑內存的差異。

第三個是數據幀的.info()說明該數據幀正在使用多少內存。

這些數字不累加。

  1. https://www.dropbox.com/s/9bda421ukwewoef/Screenshot%202014-12-08%2018.09.35.png?dl=0

  2. https://www.dropbox.com/s/bxx0wczdz7sfhcn/Screenshot%202014-12-08%2018.13.11.png?dl=0

  3. https://www.dropbox.com/s/qf20yhpn7w9fmld/Screenshot%202014-12-08%2018.13.44.png?dl=0

具體來說, df.info()命令表示該數據幀使用了約200 MB。 可用內存的差異約為700 MB(根據著名的linuxatemyram.com網站,我正在看中間一行)。

這太可怕了! 這是可重復的。 這是錯誤嗎? 還是在pandas.read_csv方法的末尾沒有發布pandas.read_csv

謝謝。

創建一個簡單的int和object dtype框架。 也可以使用Categoricals創建類似的內容。

In [1]: df_object = DataFrame({'A' : np.random.randn(5), 'B' : Series(['a','foo','bar','a really long string','baz'])})

In [4]: df_object = pd.concat([df_object]*100000,ignore_index=True)

In [2]: df_cat = df_object.copy()

In [3]: df_cat['B'] = df_cat['B'].astype('category')

In [5]: df_cat = pd.concat([df_cat]*100000,ignore_index=True)

這是.info()在0.15.1中顯示的內容。 注意“ +”

In [10]: df_object.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 500000 entries, 0 to 499999
Data columns (total 2 columns):
A    500000 non-null float64
B    500000 non-null object
dtypes: float64(1), object(1)
memory usage: 11.4+ MB

代表對象指針的內存(是int64的),而不是實際的字符串存儲。

In [6]: def as_mb(v):
   ...:         return "%.1f MB" % (v/(1024.0*1024))
   ...: 

這是python實際執行的內存使用情況。 這是上述用法的補充。 IOW,這是框架加上對象的存儲。 (python 3實際上可能使用的更少,因為它可能會對此進行一些優化)。

In [13]: import sys

In [14]: as_mb(sum(map(sys.getsizeof,df_object['B'].values)))
Out[14]: '20.5 MB'

如果您將其表示為可變長度字符串(當前不可行,但很有啟發性)

In [16]: as_mb(sum([ len(b) for b in df_object['B'] ]))
Out[16]: '2.9 MB'

如果將其轉換為numpy固定長度dtype(大熊貓將對其進行重新轉換,因此當前在大熊貓中無法實現)。

In [17]: df_object['B'].values.astype(str).dtype
Out[17]: dtype('S20')

# note that this is marginal (e.g. in addition to the above). I have subtracted out
# the int64 pointers to avoid double counting
In [19]: as_mb(df_object['B'].values.astype(str).nbytes - 8*len(df_object['B']))
Out[19]: '5.7 MB'

如果轉換為分類類型。 請注意,內存使用情況是類別數(IOW)的函數,如果您具有完全唯一的值,則不會有太大幫助。

In [11]: df_cat.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 500000 entries, 0 to 499999
Data columns (total 2 columns):
A    500000 non-null float64
B    500000 non-null category
dtypes: category(1), float64(1)
memory usage: 8.1 MB

暫無
暫無

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

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