我有一个大小为250MB的CSV文件,需要读取其中约7000行和9000列。每一行代表一张图片,每一列是一个像素(灰度值范围在0-255之间)。
我最初尝试了一个简单的np.loadtxt("data/training_nohead.csv",delimiter=",")
但是这给我带来了一个内存错误。我认为这很奇怪,因为我正在运行64位Python,并安装了8GB的内存,但它只使用了大约512MB就崩溃了。
此后,我尝试了SEVERAL其他策略,包括:
import fileinput
并逐行读取,将它们附加到数组中- 在读入整个文件后使用
np.fromstring
np.genfromtext
- 手动解析文件(由于所有数据都是整数,所以编码相当容易)
每种方法都给我带来了同样的结果。512MB左右的内存错误。想知道是否有关于512MB的特殊情况,我创建了一个简单的测试程序,直到Python崩溃前填满内存:
str = " " * 511000000 # Start at 511 MB
while 1:
str = str + " " * 1000 # Add 1 KB at a time
执行这个操作直到1GB左右时才会崩溃。我只是为了好玩,尝试了:str = " " * 2048000000
(填充2GB) - 这个操作没有任何问题。内存被填满后也没有抱怨。所以问题不在于我可以分配多少总内存,而是似乎与我可以分配多少次内存有关...
我在谷歌上搜索了很久,直到找到了这篇帖子:Python out of memory on large CSV file (numpy)
我完全复制了答案中的代码:
def iter_loadtxt(filename, delimiter=',', skiprows=0, dtype=float):
def iter_func():
with open(filename, 'r') as infile:
for _ in range(skiprows):
next(infile)
for line in infile:
line = line.rstrip().split(delimiter)
for item in line:
yield dtype(item)
iter_loadtxt.rowlength = len(line)
data = np.fromiter(iter_func(), dtype=dtype)
data = data.reshape((-1, iter_loadtxt.rowlength))
return data
这次调用 iter_loadtxt("data/training_nohead.csv")
会出现稍微不同的错误:
MemoryError: cannot allocate array memory
搜索此错误时,我只找到了一个不太有用的帖子:在创建布尔NumPy数组(Python)时出现内存错误(MemoryError)
由于我正在运行Python 2.7,所以这不是我的问题。如果有任何帮助,将不胜感激。
nxm
和数据类型。第二步:将数据放入预先分配好的数组中(指定dtype
,对于np.fromiter()
来说,指定count
可能就足够了)。 - jfs