【问题标题】:Large Numpy array handler, numpy data procession, memmap funciton mapping大型 Numpy 数组处理程序、numpy 数据处理、memmap 函数映射
【发布时间】:2018-08-27 01:31:15
【问题描述】:

带有 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 文件中?单个数组可以有多大?

我也看了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 更准确)

【问题讨论】:

    标签: python file numpy


    【解决方案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 中的 long,python 3 中的 int)和分数,但 numpy 通常不会深入研究这些类型,因为它们也具有匹配的存储和计算成本。数组的一个基本属性是它们可以使用索引计算来解决,因为元素大小是一致的。

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 2012-12-30
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2011-02-15
      相关资源
      最近更新 更多