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

6 投票
1 回答
37484 浏览
提问于 2025-04-17 13:51

我正在尝试使用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)来获取列表的大小时,却出现了以下的错误信息。

内存错误 回溯(最近的调用在最后) 在 () ----> 1 np.size(data)

C:\Python27\lib\site-packages\numpy\core\fromnumeric.pyc 在 size(a, axis) 2198 返回 a.size 2199 除非 属性错误: -> 2200 返回 asarray(a).size 2201 否则: 2202 尝试:

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

内存错误:

我甚至无法使用列表索引将这个列表分成多个部分,或者把这个列表转换成numpy数组。每次都出现同样的内存错误。

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

我在Windows 7专业版上使用的是ipython notebook。

1 个回答

12

正如@DSM在评论中提到的,你遇到内存错误的原因是因为调用 np.size 这个函数时,它会先把数据复制到一个数组里,然后再计算大小。

如果你不需要把数据当作numpy数组来使用,那就别调用 np.size。如果你想要类似numpy的索引功能,还有其他几种选择。

你可以使用pandas,这个库专门用来处理大型的数据集,不一定是数字类型的,而且它有很多很棒的工具可以帮助你处理这些数据。

如果你不想使用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

你还可以根据 header 来定义 fields,这样就不用手动输入所有50个列名,不过你需要处理一下每个字段的数据类型。

撰写回答