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