Ошибка памяти Numpy с 256 ГБ ОЗУ, 64-битным python и 64-битным numpy. улимит проблема?

В Google Land есть множество сообщений об ошибках памяти numpy, но я не могу найти ни одной, которая решает мою проблему. Я запускаю чужое программное обеспечение, используя высококлассный сервер с 256 ГБ ОЗУ, 64-битным openuse 13.1, 64-битным python и 64-битным numpy (насколько я могу судить). Смотри ниже.

Первоначальный автор недоступен для запросов о помощи, поэтому я сделал все возможное, чтобы определить размер памяти для объекта, который пытается создать numpy. Во-первых, вот трассировка стека:

File "/home/<me>/cmsRelease/trunk/Classes/DotData.py", line 193, in __new__
  DataObj = numpy.rec.fromarrays(Columns,names = names)
File "/usr/lib64/python2.7/site-packages/numpy/core/records.py", line 562, in fromarrays
  _array = recarray(shape, descr)
File "/usr/lib64/python2.7/site-packages/numpy/core/records.py", line 400, in __new__
  self = ndarray.__new__(subtype, shape, (record, descr), order=order)
MemoryError

Я использовал следующий цикл for для оценки размера объекта, насколько я знаю, как это сделать:

size = 0
for i in Columns:  # Columns is the list passed into numpy.rec.fromarrays
    size += sys.getsizeof(i)
print "Columns size: " + str(size)

Результат Columns size: 12051648. Если я не ошибаюсь, это всего 12 МБ, но в любом случае это далеко от 256 ГБ.

Основываясь на этой информации, я подозреваю, что существует системный лимит (ulimit), препятствующий доступу python к памяти. Запуск ulimit -a сообщает следующее (я установил ulimit -s 256000000 перед запуском программы):

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 2065541
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 256000000
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2065541
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Вопросы:

  1. Что мне не хватает?
  2. Разве я не правильно измерил размер объекта списка Columns?
  3. Есть ли другое системное свойство, которое мне нужно установить?

Я бы хотел, чтобы Memory Error было более конкретным. Я ценю вашу помощь.

Вспомогательная системная информация:

Системная память:

> free -h
             total       used       free     shared    buffers     cached
Mem:          252G       1.6G       250G       4.2M        12M        98M
-/+ buffers/cache:       1.5G       250G
Swap:         2.0G        98M       1.9G

Версия ОС:

> cat /etc/os-release
NAME=openSUSE
VERSION="13.1 (Bottle)"
VERSION_ID="13.1"
PRETTY_NAME="openSUSE 13.1 (Bottle) (x86_64)"
ID=opensuse
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:opensuse:13.1"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://opensuse.org/"
ID_LIKE="suse"

Версия Python:

Python 2.7.6 (default, Nov 21 2013, 15:55:38) [GCC] on linux2
>>> import platform; platform.architecture()
('64bit', 'ELF')

Непонятная версия:

>>> numpy.version
<module 'numpy.version' from '/usr/lib64/python2.7/site-packages/numpy/version.pyc'>
>>> numpy.version.version
'1.7.1'

person Mark Ebbert    schedule 02.08.2014    source источник
comment
Каково значение аргумента shape, переданного в вызов __new__? sys.getsizeof возвращает только размер контейнера, а не размер его содержимого, поэтому трудно сказать, где находится перегрузка, не зная больше о природе данных.   -  person BrenBarn    schedule 02.08.2014
comment
Предполагая, что Columns представляет собой список пустых ndarray, используйте Columns[n].nbytes, чтобы получить размер n-го столбца в байтах.   -  person ali_m    schedule 03.08.2014
comment
Прошу прощения, но я не знаю, как получить значение shape, так как оно является частью numpy. Вы можете уточнить? Отладить это ПО нереально. Он использует четыре основных языка (python, perl, java и C). Да, правда.   -  person Mark Ebbert    schedule 03.08.2014
comment
Объекты @zugzug numpy.ndarray и numpy.matrix имеют атрибут .shape, который представляет собой кортеж, содержащий количество элементов в каждом измерении массива/матрицы.   -  person ali_m    schedule 03.08.2014
comment
Похоже, Columns это питон list. Я получаю 'list' object has no attribute 'nbytes', когда пробую ваше первое предложение. РЕДАКТИРОВАТЬ: я думаю, что каждый элемент в Columns является питоном list. Это то, к чему я на самом деле призываю .nbytes.   -  person Mark Ebbert    schedule 03.08.2014
comment
Хорошо, тогда вам понадобится len(Columns), чтобы получить количество столбцов, len(Columns[0]), чтобы получить количество элементов в каждом столбце, и sys.getsizeof(Columns[n][0]), чтобы получить размер первого элемента n-го столбца в байтах. Обратите внимание, что из-за накладных расходов контейнера Python этот размер почти наверняка будет намного больше, чем соответствующий элемент numpy - см. здесь. Также было бы очень полезно знать, какие на самом деле классы для каждого столбца, т.е. type(Column[n][0]).   -  person ali_m    schedule 03.08.2014
comment
Хорошо, я действительно смущен. При всех моих усилиях я никогда не проверял, действительно ли мне не хватает памяти. Я запустил top и наблюдал, как он потребляет все 256 ГБ. Я прошу прощения. Теперь у меня гораздо большие проблемы. РЕДАКТИРОВАТЬ: И чтобы ответить на ваши вопросы, я обнаружил, что матрица 4 X 365644. Объекты представляют собой небольшие строки (48 байт).   -  person Mark Ebbert    schedule 03.08.2014
comment
@JoeKington Судя по описанию OP, у него есть вложенные списки, содержащие скалярные значения, а не пустые массивы. Насколько мне известно, sys.sizeof(<instance>) будет правильным способом получить размер встроенного скаляра (int, float, double, str и т. д.). Я также спросил у него класс скалярных элементов, поскольку соответствующий массив numpy itemsize, конечно, будет меньше, чем весь контейнер Python.   -  person ali_m    schedule 03.08.2014
comment
@ali_m - Вы совершенно правы. Я пропустил этот момент. Извините за шум!   -  person Joe Kington    schedule 03.08.2014


Ответы (1)


Действительно стыдно. Мне действительно не хватило памяти. Я запустил top и смотрю, как расходуются все 256 ГБ. Почему я так и не проверил это за все время своего расследования, загадка даже для меня самого. Приношу свои извинения за то, что не заметил очевидного.

person Mark Ebbert    schedule 02.08.2014
comment
Не хватает памяти, но почему? - person User2130; 07.09.2016