Pandas CSV 导入中二进制变量的最佳数据类型,以减少内存使用

Posted

技术标签:

【中文标题】Pandas CSV 导入中二进制变量的最佳数据类型,以减少内存使用【英文标题】:Best data types for binary variables in Pandas CSV import to decrease memory usage 【发布时间】:2019-12-13 22:28:27 【问题描述】:

我用于培训的原始文件有 25Gb。我的机器有 64Gb 的 RAM。使用默认选项导入数据总是以“内存错误”告终,因此在阅读了一些帖子后,我发现最好的选择是定义所有数据类型。

出于这个问题的目的,我使用了一个 CSV 文件:100.7Mb(这是从https://pjreddie.com/media/files/mnist_train.csv 提取的 mnist 数据集)

当我在 pandas 中使用默认选项导入它时:

keys = ['pix'.format(x) for x in range(1, 785)]
data = pd.read_csv('C:/Users/UI378020/Desktop/mnist_train.csv', header=None, names = ['target'] + keys)
# you can also use directly the data from the internet
#data = pd.read_csv('https://pjreddie.com/media/files/mnist_train.csv',
#                    header=None, names = ['target'] + keys)

pandas 的默认 dtypes 是:

data.dtypes

内存有多大?

import sys
sys.getsizeof(data)/1000000

376.800104

如果我将 dtypes 更改为 np.int8

values = [np.int8 for x in range(1, 785)]

data = pd.read_csv('C:/Users/UI378020/Desktop/mnist_train.csv', header=None, names = ['target'] + keys, 
                   dtype = dict(zip(keys, values)))

我的内存使用量减少到:

47.520104

我的问题是,对于二进制变量来说,什么是更好的数据类型以进一步减小大小?

【问题讨论】:

你得先问问自己:这真的有必要吗?您没有 50 MB 的可用 RAM 吗?过早的优化是万恶之源。 @grooveplex - 这只是 SO 的一个例子。我真正的 CSV 是 25Gb,因此我需要尽可能优化它。 哦,我不知道。请edit您的问题更清楚,因为这可能会彻底改变答案。 【参考方案1】:

参考 NumPy 文档here 在数组/列表中分配项目的最少可能选择是 numpy 的“int8”dtype,它在 C 中具有相应的“int8_t”。

对于二进制列表/类似列表的对象,“uint8”、“int8”、“byte”或“bool”类型将为 1 字节的项目产生相同的大小(分配)。

【讨论】:

以上是关于Pandas CSV 导入中二进制变量的最佳数据类型,以减少内存使用的主要内容,如果未能解决你的问题,请参考以下文章

Python导入csv数据

Pandas:使用循环和分层索引将多个 csv 文件导入数据帧

将文本文件中的数据导入 pandas 数据框

pandas写入csv文件时,如果该文件已存在

数据可视化实例: 带线性回归最佳拟合线的散点图(matplotlib,pandas)

数据可视化实例: 带线性回归最佳拟合线的散点图(matplotlib,pandas)