Ihm*_*ahr 33 python memory csv numpy scipy
我有一个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
Run Code Online (Sandbox Code Playgroud)
我得到的错误是这样的:
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
Run Code Online (Sandbox Code Playgroud)
我认为这只是一个内存不足的错误.我正在运行一个带有4GB内存的64位MacOSX,并且在64位模式下编译了numpy和Python.
我该如何解决?我应该尝试分布式方法,仅用于内存管理吗?
谢谢
编辑:也试过这个,但没有运气...
genfromtxt('All.csv',delimiter=',', dtype=float16)
Run Code Online (Sandbox Code Playgroud)
Joe*_*ton 67
正如其他人提到的,对于一个非常大的文件,你最好迭代.
但是,由于各种原因,您通常希望将整个内容放在内存中.
genfromtxt效率低得多loadtxt(虽然它处理缺失数据,而loadtxt更"精益和平均",这就是两个功能共存的原因).
如果您的数据非常规则(例如,只是所有相同类型的简单分隔行),您也可以通过使用来改进numpy.fromiter.
如果你有足够的RAM,请考虑使用np.loadtxt('yourfile.txt', delimiter=',')(您可能还需要指定skiprows文件上是否有标题.)
作为一个快速比较,加载~500MB文本文件,loadtxt在高峰使用时使用~900MB的ram,同时genfromtxt使用~2.5GB 加载相同的文件.
Loadtxt

Genfromtxt

或者,考虑以下内容.它只适用于非常简单的常规数据,但速度非常快.(loadtxt并genfromtxt进行大量的猜测和错误检查.如果您的数据非常简单和常规,您可以大大改进它们.)
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')
Run Code Online (Sandbox Code Playgroud)
Fromiter
