Python :减少具有缺失值的小整数的内存使用
Python : reducing memory usage of small integers with missing values
我正在减少代码的内存使用量。这段代码的目标是处理一些大数据集。如果相关,这些存储在 Pandas 数据框中。
在许多其他数据中,有一些小整数。由于它们包含一些缺失值 (NA) Python 默认情况下将它们设置为 float64 类型。我试图将它们向下转换为一些较小的 int 格式(例如 int8 或 int16),但由于 NA 而出现错误。
似乎有一些新的整数类型 (Int64) 可以处理缺失值,但对内存使用没有帮助。我对使用类别提出了一些建议,但我不确定这是否会在后续流程中造成瓶颈。将 float64 向下转换为 float32 似乎是我减少内存使用的主要选择(舍入误差对我的使用并不重要)。
我是否有更好的选择来减少处理具有缺失值的小整数的内存消耗?
新的 (Pandas v1.0+)“整数数组”数据类型确实可以显着节省内存。缺失值由 Pandas .isnull() 识别,并且还与 Pyarrow feather 格式兼容,该格式对写入数据具有磁盘效率。 Feather 要求按列保持一致的数据类型。参见 Pandas documentation here。这是一个例子。请注意 Pandas 特定 Int16 数据类型中的大写字母 'I'。
import pandas as pd
import numpy as np
dftemp = pd.DataFrame({'dt_col': ['1/1/2020',np.nan,'1/3/2020','1/4/2020'], 'int_col':[4,np.nan,3,1],
'float_col':[0.0,1.0,np.nan,4.5],'bool_col':[True, False, False, True],'text_col':['a','b',None,'d']})
#Write to CSV (to be read back in to fully simulate CSV behavior with missing values etc.)
dftemp.to_csv('MixedTypes.csv', index=False)
lst_cols = ['int_col','float_col','bool_col','text_col']
lst_dtypes = ['Int16','float','bool','object']
dict_types = dict(zip(lst_cols,lst_dtypes))
#Unoptimized DataFrame
df = pd.read_csv('MixedTypes.csv')
df
结果:
dt_col int_col float_col bool_col text_col
0 1/1/2020 4.0 0.0 True a
1 NaN NaN 1.0 False b
2 1/3/2020 3.0 NaN False NaN
3 1/4/2020 1.0 4.5 True d
检查内存使用情况(特别关注int_col):
df.memory_usage()
结果:
Index 128
dt_col 32
int_col 32
float_col 32
bool_col 4
text_col 32
dtype: int64
重复显式分配变量类型——包括 int_col
的 Int16
df2 = pd.read_csv('MixedTypes.csv', dtype=dict_types, parse_dates=['dt_col'])
print(df2)
dt_col int_col float_col bool_col text_col
0 2020-01-01 4 0.0 True a
1 NaT <NA> 1.0 False b
2 2020-01-03 3 NaN False NaN
3 2020-01-04 1 4.5 True d
df2.memory_usage()
在更大规模的数据中,根据我的经验,这会显着提高内存和磁盘 space 效率:
Index 128
dt_col 32
int_col 12
float_col 32
bool_col 4
text_col 32
dtype: int64
我正在减少代码的内存使用量。这段代码的目标是处理一些大数据集。如果相关,这些存储在 Pandas 数据框中。
在许多其他数据中,有一些小整数。由于它们包含一些缺失值 (NA) Python 默认情况下将它们设置为 float64 类型。我试图将它们向下转换为一些较小的 int 格式(例如 int8 或 int16),但由于 NA 而出现错误。
似乎有一些新的整数类型 (Int64) 可以处理缺失值,但对内存使用没有帮助。我对使用类别提出了一些建议,但我不确定这是否会在后续流程中造成瓶颈。将 float64 向下转换为 float32 似乎是我减少内存使用的主要选择(舍入误差对我的使用并不重要)。
我是否有更好的选择来减少处理具有缺失值的小整数的内存消耗?
新的 (Pandas v1.0+)“整数数组”数据类型确实可以显着节省内存。缺失值由 Pandas .isnull() 识别,并且还与 Pyarrow feather 格式兼容,该格式对写入数据具有磁盘效率。 Feather 要求按列保持一致的数据类型。参见 Pandas documentation here。这是一个例子。请注意 Pandas 特定 Int16 数据类型中的大写字母 'I'。
import pandas as pd
import numpy as np
dftemp = pd.DataFrame({'dt_col': ['1/1/2020',np.nan,'1/3/2020','1/4/2020'], 'int_col':[4,np.nan,3,1],
'float_col':[0.0,1.0,np.nan,4.5],'bool_col':[True, False, False, True],'text_col':['a','b',None,'d']})
#Write to CSV (to be read back in to fully simulate CSV behavior with missing values etc.)
dftemp.to_csv('MixedTypes.csv', index=False)
lst_cols = ['int_col','float_col','bool_col','text_col']
lst_dtypes = ['Int16','float','bool','object']
dict_types = dict(zip(lst_cols,lst_dtypes))
#Unoptimized DataFrame
df = pd.read_csv('MixedTypes.csv')
df
结果:
dt_col int_col float_col bool_col text_col
0 1/1/2020 4.0 0.0 True a
1 NaN NaN 1.0 False b
2 1/3/2020 3.0 NaN False NaN
3 1/4/2020 1.0 4.5 True d
检查内存使用情况(特别关注int_col):
df.memory_usage()
结果:
Index 128
dt_col 32
int_col 32
float_col 32
bool_col 4
text_col 32
dtype: int64
重复显式分配变量类型——包括 int_col
的 Int16df2 = pd.read_csv('MixedTypes.csv', dtype=dict_types, parse_dates=['dt_col'])
print(df2)
dt_col int_col float_col bool_col text_col
0 2020-01-01 4 0.0 True a
1 NaT <NA> 1.0 False b
2 2020-01-03 3 NaN False NaN
3 2020-01-04 1 4.5 True d
df2.memory_usage()
在更大规模的数据中,根据我的经验,这会显着提高内存和磁盘 space 效率:
Index 128
dt_col 32
int_col 12
float_col 32
bool_col 4
text_col 32
dtype: int64