gpt4 book ai didi

python - 为什么 352GB 的 NumPy ndarray 可以在 8GB 内存的 macOS 电脑上使用?

转载 作者:IT老高 更新时间:2023-10-28 20:34:14 25 4
gpt4 key购买 nike

import numpy as np

array = np.zeros((210000, 210000)) # default numpy.float64
array.nbytes

当我在装有 macOS 的 8GB 内存 MacBook 上运行上述代码时,没有出现错误。但是在装有 Windows 10 的 16GB 内存 PC、12GB 内存的 Ubuntu 笔记本电脑,甚至是 128GB 内存的 Linux super 计算机上运行相同的代码,Python 解释器会引发 MemoryError。所有测试环境都安装了 64 位 Python 3.6 或 3.7。

最佳答案

@Martijn Pieters' answer在正确的轨道上,但并不完全正确:这与内存压缩无关,而是与 virtual memory 有关.

例如,尝试在您的机器上运行以下代码:

arrays = [np.zeros((21000, 21000)) for _ in range(0, 10000)]

这段代码分配了 32TiB 的内存,但你不会得到错误(至少我没有,在 Linux 上)。如果我检查 htop,我会看到以下内容:

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
31362 user 20 0 32.1T 69216 12712 S 0.0 0.4 0:00.22 python

这是因为操作系统完全愿意 overcommit on virtual memory .在需要之前,它实际上不会将页面分配给物理内存。它的工作方式是:

  • calloc 要求操作系统使用一些内存
  • 操作系统查看进程的页表,并找到它愿意分配的一 block 内存。这是快速操作,操作系统只是将内存地址范围存储在内部数据结构中。
  • 程序写入其中一个地址。
  • 操作系统收到 page fault ,此时它看起来并实际将页面分配给物理内存。 A page is usually a few KiB in size .
  • 操作系统将控制权交还给程序,该程序在没有注意到中断的情况下继续进行。

在 Linux 上无法创建单个大数组,因为默认情况下,"heuristic algorithm is applied to figure out if enough memory is available". ( thanks @Martijn Pieters! ) 我系统上的一些实验表明,对我来说,内核不愿意提供超过 0x3BAFFFFFF 字节。但是,如果我运行 echo 1 | sudo tee/proc/sys/vm/overcommit_memory,然后在OP中再次尝试该程序,它工作正常。

为了好玩,尝试运行 arrays = [np.ones((21000, 21000)) for _ in range(0, 10000)]。即使在 MacO 或 Linux 上使用交换压缩,您肯定会遇到内存不足错误。是的,某些操作系统可以压缩 RAM,但它们无法将其压缩到不会耗尽内存的程度。

关于python - 为什么 352GB 的 NumPy ndarray 可以在 8GB 内存的 macOS 电脑上使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54961554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com