在具有sys.maxsize
为9223372036854775807的64位Python构建上,
但是,如果我分配更多的字符串,解释器会抛出 MemoryError
比 INT_MAX-512 MiB 字符:
$ python3
#Python 3.6.6 (default, Jul 19 2018, 14:25:17)
[GCC 8.1.1 20180712 (Red Hat 8.1.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> s = "*" * 2684354560
>>> s = "*" * 2684354561
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
(元素类型绝对为8位的 bytes 的限制是相同的。) 有足够的可用内存和交换空间,所以我确定系统不是 达到任何身体极限。
这是怎么回事,我该如何提高上限?
答案 0 :(得分:1)
分辨率:原来是 数据段大小限制
$ ulimit -d
4194304
由于某些原因,这些4294967296 B转换为每个分配2684354560 B 上限。
将此值设置为 unlimited 即可删除上限。这可以在外部完成
通过父进程(例如来自外壳程序的ulimit -d unlimited
)或
在Python本身中使用
wrapper library for resource.h
:
resource.setrlimit (resource.RLIMIT_DATA,
(resource.RLIM_INFINITY
,resource.RLIM_INFINITY))
Apparently上的更多内容
最近的内核(4.7和更高版本)RLIMIT_DATA
也会影响匿名映射,
解释了观察到的大量分配失败和我的存在
惊讶。