Как обойти Python 3 максимальный размер строки? - PullRequest
0 голосов
/ 25 сентября 2018

В 64-битной сборке Python с sys.maxsize 9223372036854775807 интерпретатор, тем не менее, выдает MemoryError , если я выделю строку из более чем INT_MAX - 512 МБ символов:

$ 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 битам.) Существует много свободной памяти и подкачки, поэтому я уверен, что система не выходит за пределы физических ограничений..

Что здесь происходит и как я могу увеличить этот предел?

1 Ответ

0 голосов
/ 25 сентября 2018

Разрешение: оказывается пределом размера сегмента данных

$ ulimit -d
4194304

По какой-то причине эти 4294967296 B преобразуются в ограничение на выделение 2684354560 B в Python.

Установка этогозначение до неограничено снимает заглушку.Это может быть сделано внешне родительским процессом (например, ulimit -d unlimited из оболочки) или в самом Python, используя библиотеку оболочки для resource.h:

resource.setrlimit (resource.RLIMIT_DATA,
                    (resource.RLIM_INFINITY
                    ,resource.RLIM_INFINITY))

Видимо в более новых ядрах (4.7 и более поздних) RLIMIT_DATA также влияет на анонимные сопоставления, что объясняет как наблюдаемый сбой распределений большого размера, так и мое удивление.

...