6

我正在尝试使用 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(data) 获取此列表的长度,它返回 401125。我什至可以通过调用列表索引来获取每个单独的记录。但是当我尝试通过调用 np.size(data) (我将 numpy 作为 np 导入)来获取列表的大小时,我得到了以下堆栈跟踪。

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

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

C:\Python27\lib\site-packages\numpy\core\numeric.pyc in asarray(a, dtype, order) 233 234 """ --> 235 return array(a, dtype, copy=False, order=order ) 236 237 def asanyarray(a, dtype=None, order=None):

内存错误:

我什至不能使用列表索引将该列表分成多个部分,或者将该列表转换为一个 numpy 数组。它给出了同样的内存错误。

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

我在 Windows 7 Professional 中使用 ipython notebook。

4

1 回答 1

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

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

于 2013-01-27T20:10:30.923 回答