大型Numpy数组处理程序,numpy数据处理,memmap函数映射

时间:2018-03-18 10:31:45

标签: python file numpy

带有nyp文件和memmap函数的大型numpy数组(超过4GB)

我正在使用numpy包进行数组计算,其中我读了https://docs.scipy.org/doc/numpy/neps/npy-format.html

在“格式规范:版本2.0”中,它表示,对于.npy文件,“版本2.0格式将标头大小扩展为4 GiB”。

我的问题是:

  1. 标题大小是多少?这是否意味着我只能将大小为4GB数组的numpy.array保存到npy文件中?一个阵列有多大?
  2. 我也读过https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.memmap.html 其中声明“在32位系统上内存映射文件不能超过2GB”

    1. 是不是意味着numpy.memmap的限制是基于系统的内存?反正有没有避免这种限制?

    2. 此外,我读到我们可以选择数组的dtype,其中最佳分辨率为“complex128”。有没有办法在64位计算机上更准确地“使用”和“保存”元素?(比complex128或float64更准确)

1 个答案:

答案 0 :(得分:1)

前一个标头大小字段为16位宽,允许标头小于64KiB。因为标题描述了数据的结构,并且不包含数据本身,所以对于大多数人来说这不是一个大问题。引用笔记,“具有大量列的结构化数组可以超出这个范围。”所以为了回答第一个问题,标题大小低于64KiB,但数据出现后,所以这不是数组大小限制。格式未指定数据大小限制。

内存映射容量取决于操作系统和机器架构。现在我们已经基本上转向平面但通常是虚拟地址映射,因此程序本身,堆栈,堆和映射文件都争用相同的空间,总共4GiB为32位指针。操作系统经常将它分成相当大的块,因此一些系统可能只允许2GiB用户空间,其他系统3GiB;通常你可以映射比你可以分配更多的内存。 memmap限制​​与使用的操作系统关系比物理内存更紧密。

非平坦地址空间(例如在OS / 2上使用不同的段)可能允许更大的使用。成本是指针不再是单个单词。例如,PAE为操作系统提供了一种使用更多内存的方法,但仍然保留了具有自己的32位限制的进程。通常,现在使用64位系统更容易,允许内存空间高达16艾字节。由于数据大小已经增长很多,我们还会处理更大的部分,例如4MiB或16MiB分配,而不是传统的4KiB页面或512B扇区。物理内存通常具有更多实际限制。

是的,有些元素的精度高于64位浮点数;特别是64位整数。这通过牺牲所有指数有效地使用更大的尾数。 Complex128是两个64位浮点数,并没有更高的精度,而是第二个维度。有些类型可以任意精确地增长,例如Python的长整数(python 2中的长整数,python 3中的int)和分数,但是numpy通常不会深入研究那些因为它们也具有匹配的存储和计算成本。数组的基本属性是可以使用索引计算来解决它们,因为元素大小是一致的。