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 导入中二进制变量的最佳数据类型,以减少内存使用的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:使用循环和分层索引将多个 csv 文件导入数据帧