[英]Pandas Dataframe memory read_csv
以下是三個屏幕截圖。 前兩個簡單地通過輸入將csv讀取到數據幀的命令( pandas.read_csv
)來顯示空閑內存的差異。
第三個是數據幀的.info()
說明該數據幀正在使用多少內存。
這些數字不累加。
https://www.dropbox.com/s/9bda421ukwewoef/Screenshot%202014-12-08%2018.09.35.png?dl=0
https://www.dropbox.com/s/bxx0wczdz7sfhcn/Screenshot%202014-12-08%2018.13.11.png?dl=0
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.