gpt4 book ai didi

大型 CSV 文件 (numpy) 上的 Python 内存不足

转载 作者:IT老高 更新时间:2023-10-28 21:53:20 28 4
gpt4 key购买 nike

我有一个 3GB 的 CSV 文件,我尝试用 python 读取,我需要中间列。

from numpy import * 
def data():
return genfromtxt('All.csv',delimiter=',')

data = data() # This is where it fails already.

med = zeros(len(data[0]))
data = data.T
for i in xrange(len(data)):
m = median(data[i])
med[i] = 1.0/float(m)
print med

我得到的错误是这样的:

Python(1545) malloc: *** mmap(size=16777216) failed (error code=12)

*** error: can't allocate region

*** set a breakpoint in malloc_error_break to debug

Traceback (most recent call last):

File "Normalize.py", line 40, in <module>

data = data()

File "Normalize.py", line 39, in data

return genfromtxt('All.csv',delimiter=',')

File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-
packages/numpy/lib/npyio.py", line 1495, in genfromtxt

for (i, line) in enumerate(itertools.chain([first_line, ], fhd)):

MemoryError

我认为这只是内存不足的错误。我正在运行具有 4GB 内存的 64 位 MacOSX,并且 numpy 和 Python 都以 64 位模式编译。

我该如何解决这个问题?我应该尝试分布式方法,仅用于内存管理吗?

谢谢

编辑:也试过这个,但没有运气......

genfromtxt('All.csv',delimiter=',', dtype=float16)

最佳答案

正如其他人所提到的,对于一个非常大的文件,您最好进行迭代。

但是,出于各种原因,您通常确实希望将整个内容保存在内存中。

genfromtxtloadtxt 效率低得多(尽管它处理丢失的数据,而 loadtxt 更“精简和平均”,即为什么这两个功能共存)。

如果您的数据非常规则(例如,只是所有相同类型的简单分隔行),您还可以通过使用 numpy.fromiter 来改进。

如果你有足够的内存,考虑使用 np.loadtxt('yourfile.txt', delimiter=',') (你可能还需要指定 skiprows 如果你有一个文件头。)

作为一个快速比较,使用 loadtxt 加载约 500MB 的文本文件在使用高峰时使用约 900MB 的内存,而使用 genfromtxt 加载相同的文件使用约 2.5GB。

加载txt Memory and CPU usage of numpy.loadtxt while loading a ~500MB ascii file


Genfromtxt Memory and CPU usage of numpy.genfromtxt while loading a ~500MB ascii file


或者,考虑以下类似的事情。它只适用于非常简单的常规数据,但速度非常快。 (loadtxtgenfromtxt 做了很多猜测和错误检查。如果你的数据非常简单和规则,你可以大大改进它们。)

import numpy as np

def generate_text_file(length=1e6, ncols=20):
data = np.random.random((length, ncols))
np.savetxt('large_text_file.csv', data, delimiter=',')

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

#generate_text_file()
data = iter_loadtxt('large_text_file.csv')

Fromiter

Using fromiter to load the same ~500MB data file

关于大型 CSV 文件 (numpy) 上的 Python 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8956832/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com