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