在Python中处理非常大的数据集 - 内存错误
我正在尝试使用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 个回答
正如@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个列名,不过你需要处理一下每个字段的数据类型。