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值不同!
标签:pytables,large-files,mmap,python,numpy 来源: https://codeday.me/bug/20191029/1957261.html