以小块的形式创建非常大的 NUMPY 数组(PyTables 与 numpy.memmap)

Kar*_*Man 5 python mmap numpy large-files pytables

SO 有很多问题看起来是相同的,但它们并没有真正完全回答我的问题。我认为这对于计算科学家来说是一个非常常见的用例,所以我正在创建一个新问题。

问题:

我从文件中读取了几个小的 numpy 数组(每个约 10 MB)并对它们进行一些处理。我想创建一个更大的数组 (~1 TB),其中数组中的每个维度都包含这些较小文件之一的数据。任何试图在 RAM 中创建整个较大数组(或其大部分)的方法都是不合适的,因为它会淹没 RAM 并使机器停止运行。因此,我需要能够初始化较大的数组并小批量填充它,以便每个批次都写入磁盘上的较大数组。

我最初认为 numpy.memmap 是可行的方法,但是当我发出类似的命令时

mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2))
Run Code Online (Sandbox Code Playgroud)

RAM 泛滥,机器速度减慢直至停止。

经过一番探索后,PyTables 似乎很适合这类事情,但我不太确定。此外,很难在文档或其他地方找到一个简单的示例来说明这种常见的用例。

如果有人知道如何使用 PyTables 来完成此操作,或者有更有效/更快的方法来完成此操作,请告诉我!任何参考文献。给个例子表示赞赏!

fav*_*vba 4

这很奇怪。np.memmap 应该可以工作。我一直在 12Gb RAM 机器上使用它处理 250Gb 数据,没有出现任何问题。

系统真的在创建memmap文件的那一刻就耗尽了内存吗?或者它是沿着代码发生的?如果它发生在文件创建时我真的不知道问题是什么。

当我开始使用 memmap 时,我犯了一些错误,导致内存耗尽。对我来说,类似下面的代码应该有效:

mmapData = np.memmap(mmapFile, mode='w+', shape = (smallarray_size,number_of_arrays), dtype ='float64')

for k in range(number_of_arrays):
  smallarray = np.fromfile(list_of_files[k]) # list_of_file is the list with the files name
  smallarray = do_something_with_array(smallarray)
  mmapData[:,k] = smallarray
Run Code Online (Sandbox Code Playgroud)

这可能不是最有效的方法,但在我看来,它的内存使用量是最低的。

Ps:请注意,memmap(int) 和 fromfile(float) 的默认 dtype 值是不同的!