- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近看到,当通过 np.empty
或 np.zeros
创建一个 numpy 数组时,该 numpy 数组的内存实际上并没有被操作系统分配,因为在 this answer 中讨论(和 this question ),因为 numpy 利用 calloc
来分配数组的内存。
In fact, the OS isn't even "really" allocating that memory until you try to access it.
因此,
l = np.zeros(2**28)
不会增加系统报告的已用内存,例如,在 htop
中。只有当我触及内存时,例如通过执行
np.add(l, 0, out=l)
使用的内存增加了。
由于这种行为,我有几个问题:
如果我只是在一段时间后才接触内存块,操作系统是否会在后台复制 numpy 数组的内容以保证内存是连续的?
i = 100
f[:i] = 3
while True:
... # Do stuff
f[i] = ... # Once the memory "behind" the already allocated chunk of memory is filled
# with other stuff, does the operating system reallocate the memory and
# copy the already filled part of the array to the new location?
i = i + 1
由于numpy数组的内存在内存中是连续的,我认为
f[-1] = 3
可能需要分配整个内存块(不触及整个内存)。然而,事实并非如此,htop 中使用的内存不会随着数组的大小而增加。为什么不是这样?
最佳答案
OS isn't even "really" allocating that memory until you try to access it
这取决于目标平台(通常是操作系统及其配置)。一些平台直接在物理内存中分配页面(例如 AFAIK XBox 和一些嵌入式平台一样)。然而,主流平台确实这样做了。
1. Is touched memory copied under the hood?
If I touch chunks of the memory only after a while, is the content of the numpy array copied under the hood by the operating system to guarantee that the memory is contiguous?
分配在虚拟内存 中执行。在给定的内存页面(固定大小的 block ,例如 4 KiB)上完成第一次触摸时,操作系统将虚拟页面映射到物理页面。因此,当您只设置数组的一项时,只有一页将被物理映射(除非该项目跨越两页,这只发生在病态情况下)。
对于一组连续的虚拟页面,物理页面可能不是连续的。但是,这不是问题,您不应该关心它。这主要是操作系统的工作。话虽这么说,现代处理器有一个名为 TLB 的专用单元,用于将虚拟地址(您可以通过调试器看到的地址)转换为物理地址(因为这种转换相对昂贵和性能至关重要)。
由于分页,Numpy 数组的内容不会重新分配或复制(至少从用户的角度来看,即在虚拟内存中)。
2. Touching the last element
I thoughtf[-1] = 3
might require the entire block of memory to be allocated (without touching the entire memory). However, it does not, the utilized memory in htop does not increase by the size of the array. Why is that not the case?
由于分页,只有与 Numpy 数组关联的虚拟内存中的最后一页被映射。这就是为什么您看不到 htop 有很大变化的原因。但是,如果仔细观察,您应该会看到细微的变化(您平台上的页面大小)。否则,这应该意味着由于其他先前的回收分配,页面已经被映射。实际上,分配库可以预分配内存区域以加快分配速度(通过减少对操作系统的慢速请求的数量)。该库还可以在 Numpy 释放内存时保持内存映射,以加速下一次分配(因为内存不必取消映射然后再次映射)。这在实践中不太可能发生在巨大的阵列上,因为对内存消耗的影响太昂贵了。
关于python - 在 numpy.zeros 中第一次接触内存后如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70055063/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!