在python中处理一个非常大的数据集 - 内存错误

mah*_*kya 6 python numpy data-analysis python-2.7

我正在尝试使用python中的csv模块处理从csv文件获取的数据.这里有大约50列和401125行.我使用以下代码块将该数据放入列表中

csv_file_object = csv.reader(open(r'some_path\Train.csv','rb'))
header = csv_file_object.next()
data = []
for row in csv_file_object:
    data.append(row)
Run Code Online (Sandbox Code Playgroud)

我可以使用len(数据)获取此列表的长度并返回401125.我甚至可以通过调用列表索引来获取每个单独的记录.但是当我尝试通过调用np.size(data)来获取列表的大小时(我将numpy导入为np),我获得了以下堆栈跟踪.

MemoryError Traceback(最近一次调用last)in()----> 1 np.size(data)

C:\ Python27\lib\site-packages \numpy\core\fromnumeric.pyc in size(a,axis)2198返回a.size 2199除AttributeError: - > 2200返回asarray(a).size 2201 else:2202试试:

asarray中的C:\ Python27\lib\site-packages \numpy\core \numeric.pyc(a,dtype,order)233 234""" - > 235返回数组(a,dtype,copy = False,order = order )236 237 def asanyarray(a,dtype = None,order = None):

的MemoryError:

我甚至无法使用列表索引将该列表分成多个部分或将此列表转换为numpy数组.它给出了同样的内存错误.

我该如何处理这种大数据样本.有没有其他方法来处理像这样的大型数据集.

我在Windows 7专业版中使用ipython笔记本.

Dou*_*gal 12

正如@DSM在评论中所指出的,你得到内存错误的原因是调用np.size列表会先将数据复制到数组中,然后获取大小.

如果您不需要将它作为numpy数组使用,请不要调用np.size.如果你确实想要类似numpy的索引选项,那么你有几个选择.

您可以使用pandas,它用于处理大型不一定数值的数据集,并且有一些很好的帮助器和实现的东西.

如果你不想这样做,你可以定义一个numpy 结构数组,并在第一个位置逐行填充它,而不是制作一个列表并复制到它中.就像是:

fields = [('name1', str), ('name2', float), ...]
data = np.zeros((num_rows,), dtype=fields)

csv_file_object = csv.reader(open(r'some_path\Train.csv','rb'))
header = csv_file_object.next()
for i, row in enumerate(csv_file_object):
    data[i] = row
Run Code Online (Sandbox Code Playgroud)

您还可以fields基于此进行定义,header因此您不必手动键入所有50个列名称,但您必须为每个列名称指定数据类型.