使用256GB RAM、64位Python和64位Numpy时遇到了Numpy内存错误。是ulimit问题吗?

3
在谷歌上有很多与numpy内存错误相关的帖子,但我找不到解决我的问题的帖子。我正在使用一台配备256GB RAM的高端服务器,64位opensuse 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)

结果是列大小:12051648。除非我弄错了,那只有12MB,但无论如何,它都远远达不到256GB。
根据这些信息,我怀疑存在系统限制(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版本:

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

2
shape参数在__new__调用中传递的值是多少? sys.getsizeof仅返回容器的大小,而不是其内容的大小,因此很难确定重载在哪里,除非更多地了解数据的性质。 - BrenBarn
假设Columns是一个numpy ndarray列表,使用Columns[n].nbytes获取第n列的大小(以字节为单位)。 - ali_m
抱歉,我不知道如何获取numpy中的shape值。你能解释一下吗?调试这个软件是不现实的。它使用了四种主要语言(Python、Perl、Java和C)。是的,真的。 - Mark Ebbert
1
根据OP的描述,他似乎有包含标量值而不是numpy数组的嵌套列表。据我所知,sys.sizeof(<instance>)将是获取内置标量(intfloatdoublestr等)大小的正确方法。我还问了他标量元素的类,因为相应的numpy数组itemsize当然会比整个Python容器小。 - ali_m
@ali_m - 你说得很对。我漏掉了那个点。抱歉给你带来干扰! - Joe Kington
显示剩余4条评论
1个回答

4

真的很尴尬。我真的快没有内存了。我启动了top命令,看着所有的256GB内存被消耗完了。为什么我在所有的调查中都没有检查过这个问题,甚至对自己也是一个谜。我对忽略了这个显而易见的问题表示歉意。


内存不足了,但是为什么? - User2130

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接