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 来完成此操作,或者有更有效/更快的方法来完成此操作,请告诉我!任何参考文献。给个例子表示赞赏!
这很奇怪。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 值是不同的!
| 归档时间: |
|
| 查看次数: |
4061 次 |
| 最近记录: |