Максимальный размер RawArray для разделяемого массива в python - PullRequest
1 голос
/ 08 мая 2019

При попытке создать массив для использования совместно используемой памяти в нескольких процессах я получаю сообщение об ошибке:

    shared_array = RawArray('d', xsize)
  File "C:\Python27\lib\multiprocessing\sharedctypes.py", line 88, in RawArray
    obj = _new_value(type_)
  File "C:\Python27\lib\multiprocessing\sharedctypes.py", line 68, in _new_value
    wrapper = heap.BufferWrapper(size)
  File "C:\Python27\lib\multiprocessing\heap.py", line 242, in __init__
    assert 0 <= size < sys.maxint
AssertionError

Похоже, что он выше некоторого максимального значения, однако, даже когда я запускаю простой пример, подобный приведенному ниже:

from multiprocessing.sharedctypes import RawArray
import sys

xsize = 999999999
#create an empty array    
print('MaxInt:',sys.maxint)
print('My Size:',xsize)
shared_array = RawArray('d', xsize)

В печатных отчетах показывается:

('MaxInt:', 2147483647)
('My Size:', 999999999)

Почему это происходит, и как я могу создать общий массив для многопроцессорной обработки при наличии очень больших массивов? Мой компьютер имеет 128 ГБ оперативной памяти, так что это не должно быть проблемой.

1 Ответ

2 голосов
/ 09 мая 2019

и int здесь будет int типа "C", который обычно составляет 4 байта, но вы запрашиваете его и, следовательно, максимальный размер массива, выполняя:

from sys import maxint
from ctypes import sizeof, c_int

maxint // sizeof(c_int)

который для вас (с 32-битной сборкой) будет ~ 512M элементов. Однако если вы используете 32-битную сборку, то ваше адресное пространство будет гораздо большим ограничивающим фактором, и вы почти наверняка не сможете выделить такой большой массив.

Я использую 64-битные сборки Python 2.7 и 3.7, где sys.maxint и sys.maxsize оба 2**63-1, и оба позволяют мне выделить массив с миллиардом (10**9) элементов (и я вижу, что Python имеет ~ 4 ГБ RSS ), хотя требуется некоторое время, чтобы обнулить все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...