【发布时间】:2018-11-22 09:48:29
【问题描述】:
我有一个大约 16GB 的文件 bad_orders.csv 被读入 58GB RAM 机器内的一个 numpy 数组。
ubuntu@ip-172-31-22-232:~/Data/Autoencoder_Signin/joined_signin_rel$ free -g
total used free shared buff/cache available
Mem: 58 0 58 0 0 58
Swap: 0 0 0
当我运行以下命令时,作业被反复杀死:
import numpy as np
arr = np.genfromtxt('bad_orders.csv', delimiter =',', missing_values='',dtype='float32')
终端显示它正在使用不成比例的内存:
ubuntu@ip-172-31-22-232:~$ free -g
total used free shared buff/cache available
Mem: 58 42 12 0 3 16
Swap: 0 0 0
然后我尝试从原始文件中采样 10000 行并检查内存使用情况:
In [7]: samples = np.genfromtxt('samples.csv',delimiter=',',
missing_values='', dtype='float32')
In [8]: samples.nbytes
Out[8]: 16680000
示例 numpy 数组显示大小为 0.017GB。我的文件总共有大约 8M 行,所以如果内存使用量呈线性增长,大型 numpy 数组应该占用 13GB 内存。为什么我在读取整个文件时需要超过 50GB?
【问题讨论】:
-
加载文件时的使用量将超过最终数组的使用量。有多少列? 2085? (每个项目 8 个字节,1000 行)。典型的线宽是多少?
-
尝试使用
np.fromiter的迭代器/生成器。可能会慢一些,但内存效率应该更高。如果您事先知道尺寸,那应该不会太糟糕。类似(map(float, row) for row in csv.reader(open('myfile.csv')) -
使用纯浮点数、没有缺失值和简单的分隔符,
genfromtxt可能是矫枉过正。当您需要使用标题字段名称并自动推导出字段dtypes时,它会更有用。 -
@hpaulj 总列数为417。我之所以使用
genfromtxt是因为loadtxt无法处理缺失值,这种情况下我的缺失值是空字符串。 -
请告诉我们发生了什么,您尝试过 pandas 吗?
标签: python arrays numpy memory