处理非常大的数组 - Numpy

5 投票
1 回答
3957 浏览
提问于 2025-04-18 17:53

我的情况是这样的:

  1. 我大约有7000万个整数值,这些值分布在不同的文件中,涉及大约10个类别的数据(具体数量不太确定)。

  2. 我读取这些文件,然后用这些数据创建一些Python对象。这显然包括逐行读取每个文件,并将数据添加到Python对象中。所以我会有一个包含7000万个子数组的数组,每个子数组里有10个值。

  3. 我对这些数据进行一些统计处理。这会涉及到将几个值(比如百分位排名)添加到每一行数据中。

  4. 我把这个对象存储在数据库里。

现在,我从来没有处理过这么大规模的数据。我的第一反应是使用Numpy来提高内存使用效率,因为它的数组更高效。但我听说在Numpy数组中,不建议使用“append”操作,因为这样效率不高。

那么,你有什么建议吗?对于处理这么大规模的数据,有什么一般性的建议吗?如果需要,我可以通过随机抽样将数据缩减到20%的大小。

编辑:为了更清楚地说明数据的大小和类型进行了编辑。

1 个回答

6

如果我理解得没错,你的数据集大约有7亿个整数。即使你用的是64位的整数,这样也只占大约6GB的空间。根据你电脑的内存大小和你想进行的统计处理,这个数据集听起来在普通的numpy数组中是可以轻松处理的。


如果数据集太大,无法全部放进内存,一个简单的解决办法是使用内存映射数组(numpy.memmap)。在大多数情况下,np.memmap数组的表现和普通的numpy数组差不多,但它不会把整个数据集都存储在系统内存中,而是根据需要动态地从磁盘上的文件中读取或写入数据。

另一个选择是把数据存储在HDF5文件中,比如使用PyTablesH5py。HDF5可以让数据在磁盘上进行压缩,而PyTables还提供了一些非常快速的方法来对大型基于磁盘的数组进行数学运算。

撰写回答