【问题标题】:Working with very large arrays - Numpy使用非常大的数组 - Numpy
【发布时间】:2014-08-20 07:32:07
【问题描述】:

我的情况是这样的:

  1. 我有大约 7000 万个整数值分布在各种文件中,用于大约 10 类数据(确切数字未知)

  2. 我读取了这几个文件,并使用这些数据创建了一些 python 对象。这显然包括逐行读取每个文件并附加到 python 对象。所以我将有一个包含 70 百万个子数组的数组,每个子数组有 10 个值。

  3. 我对该数据进行了一些统计处理。这将涉及将几个值(例如,百分位等级)附加到每个“行”数据。

  4. 我将此对象存储在数据库中

现在我从未使用过这种规模的数据。我的第一直觉是使用 Numpy 来获得更有效的数组 w.r.t 内存。但后来我听说在 Numpy 数组中,不鼓励使用 'append',因为它效率不高。

那么你会建议我选择什么?处理这种大小的数据的任何一般提示?如果需要,我可以通过随机抽样将数据减少到其大小的 20%。

编辑:为了清楚地了解数据的大小和类型而进行了编辑。

【问题讨论】:

  • “大约 70 百万” - 70 什么? 7000 万字节的数据? 7000 万个数据点? 70 的缩写为“mil”的东西?你能把这一点扩大一点吗?
  • 看看pandas
  • @Korem 如何使用 pandas 解决内存存储问题? Pandas 使用 numpy,pandas 结构会有额外的开销,因此会增加内存使用量。这里的想法是尽可能创建一次你的结构,一次增长它们是低效的。您的问题有点宽泛,但这可能会有所帮助:stackoverflow.com/questions/14262433/…
  • 是的,我不关心内存中的实际大小,因为不可能绕过它。我主要关心的是大型 numpy 数组上的“追加”操作。
  • 您是否考虑过预先分配一个 numpy 数组然后分配值? my_array = numpy.zeros(length); for i, line in enumerate(file): ... my_array[i] = ...

标签: python numpy


【解决方案1】:

如果我正确理解您的描述,您的数据集将包含约 7 亿个整数。即使您使用 64 位整数,仍然只有大约 6GB。根据您拥有多少 RAM 以及您想要在统计处理方面做什么,您的数据集听起来就像一个位于核心内存中的普通 numpy 数组一样易于管理。


如果数据集太大而无法放入内存,一个简单的解决方案可能是使用内存映射数组 (numpy.memmap)。在大多数方面,np.memmap 数组的行为类似于普通的 numpy 数组,但它不会将整个数据集存储在系统内存中,而是根据需要动态地从磁盘上的文件读取/写入。

另一种选择是将数据存储在 HDF5 文件中,例如使用 PyTablesH5py。 HDF5 允许在磁盘上压缩数据,PyTables 包含一些非常快速的方法来对基于磁盘的大型数组执行数学运算。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2020-07-19
    • 2019-03-30
    • 2016-06-30
    • 2010-11-06
    相关资源
    最近更新 更多