Ошибка памяти на сервере Linux, но не Mac

Я знаю, что есть тонна проблем с ошибкой памяти, поэтому я надеюсь, что я ничего не дублировал. Я пытаюсь создать np-массив, используя np.zeros((500000,10000)). Это отлично работает на моем Mac с 16 ГБ памяти, но на сервере Linux с 28 ГБ оперативной памяти он мгновенно выходит из памяти с ошибкой Memory Error. Я проверил, что я запускаю 64-разрядную версию Ubuntu и Python, и я на Numpy 1.9.3. Единственное различие, которое я заметил между системами (помимо очевидного), заключается в том, что при запуске ulimit -a я получаю:

Linux: max locked memory (kbytes, -l) 64

Mac: max locked memory (kbytes, -l) unlimited

Может быть, это причина, по которой я не могу запустить эту команду? Если нет, есть ли другой вариант конфигурации, который мне не хватает?

Ответы

Ответ 1

Мое лучшее предположение:

  1. У Mac есть своп, который позволяет выделить выделенную память, а не оперативную память.
  2. Mac не понимает, что массив не вписывается в память до тех пор, пока память не будет использована. Таким образом, массив фактически не вписывается в память, но вы не узнаете его, пока не будете использовать эту память.

Я основываю свое первое предположение в том, что в 64 бит ваш массив будет принимать 500000 * 10000 * 8 = 40 ГБ ОЗУ 20 ГБ в 32 бит, и поэтому массив не вписывается в имеющуюся у вас память. Может быть своп, чтобы учесть недостающую память.

Я основываю свое второе предположение в этой ссылке, где объясняется, что np.zeros не будет распределять фактически в памяти нули, пока эта память не будет доступна в первый раз. Я тестировал на своем компьютере Linux (Ubuntu), что np.zeros работает с увеличивающимися массивами, пока не достиг предела моей RAM. Затем я получаю ошибку памяти, даже если она фактически не выделяет память.

Когда вы создадите матрицу (увеличьте размер, достаточный, чтобы очистить использование памяти):

a = np.zeros((50,10))

Вы можете проверить фактическую память, необходимую для хранения нуля в каждой ячейке матрицы:

a[:,:] = 0.0

Или принудительно выполнить операцию, чтобы доступ к памяти и, следовательно, был распределен:

a = a + a

Следите за использованием памяти компьютера во время выполнения этой проверки, чтобы понять, когда выделена память.