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

时间:2013-01-27 19:45:43

标签: python numpy python-2.7 data-analysis

我正在尝试使用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)

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

  

MemoryError Traceback(最近一次调用   最后)in()   ----> 1 np.size(数据)

     

C:\ Python27 \ lib \ site-packages \ numpy \ core \ fromnumeric.pyc的大小(a,   轴)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 professional中使用ipython notebook。

1 个答案:

答案 0 :(得分:12)

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

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

你可以使用pandas,它用于处理大型不一定数值的数据集,并且有一些很棒的帮助器和东西。

如果你不想这样做,你可以定义一个numpy structure array并在第一个地方逐行填充它,而不是制作一个列表并复制到它中。类似的东西:

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

您还可以根据fields定义header,这样您就不必手动输入所有50个列名,但您必须为每个列指定数据类型。