在python内存中处理非常大的数据集

2024-09-27 04:25:52 发布

您现在位置: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)来获得列表的大小时,我得到了下面的堆栈跟踪。

MemoryError Traceback (most recent call last) 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):

MemoryError:

我甚至无法使用列表索引将该列表分成多个部分,也无法将该列表转换为numpy数组。它会产生同样的内存错误。

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

我在windows 7专业版中使用ipython笔记本。


Tags: csv数据innumpy列表datasizereturn
1条回答
网友
1楼 · 发布于 2024-09-27 04:25:52

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

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

您可以使用pandas,它用于处理不一定是数字的大数据集,并且有一些很好的助手和工具来完成这项工作。

如果您不想这样做,您可以定义一个numpystructure 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

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

相关问题 更多 >

    热门问题