为啥当 `perl -V:ptrsize` 返回 4 时我能够加载 4.19 GB 的内存?

Posted

技术标签:

【中文标题】为啥当 `perl -V:ptrsize` 返回 4 时我能够加载 4.19 GB 的内存?【英文标题】:Why was I able to load 4.19 GB of memory when `perl -V:ptrsize` returned 4?为什么当 `perl -V:ptrsize` 返回 4 时我能够加载 4.19 GB 的内存? 【发布时间】:2020-09-14 05:19:18 【问题描述】:

我有这个输出:

root@hostname:/home/admin# perl -V:ptrsize
ptrsize='4';

根据this answer,ptrsize='4' 表示 perl 能够寻址 4GB 内存。

但是,在将大量数据加载到内存中时,我始终能够准确地加载 4190924 (4.19),然后再遇到 Out of memory 错误。

为什么它没有像预期的那样在4000000 (4GB) 失败?

为了完整起见,我检查了运行qx grep VmSize /proc/$$/status ;所使用的内存量

【问题讨论】:

4GiB = 4 * 1024 * 1024 * 1024.GB (Gigabyte) != GiB (Gigibyte) 即使它经常被混为一谈(有些工具令人讨厌地报告。参见 Gigibyte - en.wikipedia.org/wiki/Gibibyte 我已经更正了链接的答案 (GB => GiB)。不是每个人都熟悉“GiB”,所以我已经避免了很长时间。 【参考方案1】:

32 位指针的限制是 2^32 = 4,294,967,296 字节,正确表示为 4 GiB,但通常称为 4GB。这是 4,194,304 kiB(VmSize 报告的单位)。你在 4kiB(在大多数系统上为一页)之内。

【讨论】:

以上是关于为啥当 `perl -V:ptrsize` 返回 4 时我能够加载 4.19 GB 的内存?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 '<' 和 'lt' 运算符在 Perl 中返回不同的结果?

为啥 Perl 文件 glob() 不能在标量上下文中的循环之外工作?

为啥当我使用 Perl 的 REST::Client 发送 POST 请求,而不是使用 Perl 的 LWP::UserAgent 或 Python 时,我得到“405: Method Not All

为啥查询不返回值?

当 BCP 失败时,Perl system() 命令不返回失败

为啥 ncat -exec 可以与 shell 脚本一起使用,但不能与 perl 脚本一起使用?