为啥当 `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