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

关于SO的问题似乎很多,但是它们并不能完全回答我的问题.我认为这对于计算科学家来说是一个非常普遍的用例,因此我提出了一个新问题.

题:

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

我最初以为numpy.memmap是要走的路,但是当我发出类似

mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2))

RAM泛滥,机器减速停止.

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

如果有人知道如何使用PyTables完成此操作,或者如果有更有效/更快的方法来执行此操作,请告诉我!任何裁判.以实例表示赞赏!

解决方法:

这很奇怪. 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

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

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

上一篇:内存映射


下一篇:linux – munmap()使用私有匿名映射的ENOMEM失败