一、疑难杂症
最近使用pandas计算时,总是感觉dataframe占用内存过大,内存不足,导致计算时间被拉长。于是,趁着周末一探究竟。找到一个原因,与大家分享!
二、探寻原因
首先,pandas底层数据存储与计算是基于numpy的。通过查找资料我们发现,pandas的主要类型主要是下表的第一列。这几类是pandas的数据大类,后面的 Numpy type是其包含的小雷。在我们利用pandas读取数据时,尤其是数值型数据时,他会默认启用大类来定义数据类型。比如:表里只有数字1或者1.0,就会被定义为int64或者float64。作为充分考虑数据的多变性,这种行为是没有疑义的。但是,but,他就是消耗了内存。
常用数据类型的占用内存情况如下:
flaottype =['float32','float64']
inttypes = ["uint8", "int8", "int16",'float32']
for it in inttypes:
print(np.iinfo(it))
# 这段代码可以输出数据类型的表示范围。
知道了这些不同类型的数据类型占用的内存大小,再进一步掌握自己实际操作的数据的范围,就可以选择合适的数据类型,这样可以节省内存,优化计算。
三、方案
放一个操作的demo。大家可以结合实际进行操作。前后的内训占用节省了月65%欢迎指正!
df3.info()
输出
<class 'pandas.core.frame.DataFrame'>
Index: 34519 entries, a to m
Data columns (total 17 columns):
.......省略........
dtypes: float64(7), int64(10)
memory usage: 6.0+ MB --------------默认读取的类型,占用内存
df4 = df3.astype(np.int8)
输出
<class 'pandas.core.frame.DataFrame'>
Index: 34519 entries, a to m
Data columns (total 17 columns):
.......省略........
dtypes: int8(17)
memory usage: 2.1+ MB---------------astype修改后的,占用内存
参考:
https://pbpython.com/pandas_dtypes.html
https://blog.csdn.net/wj1066/article/details/81124959