Python3.4:OSError:[Errno 12]无法分配内存

时间:2015-03-03 19:07:24

标签: python linux memory memory-leaks multiprocessing

我正在dijk_inner_mp.py文件中初始化一堆1048576×16长的多处理数组:

N1=1048576
DEG1=16
P1=1
W = [[0 for x in range(DEG1)] for x in range(N1)]
W_index = [[0 for x in range(DEG1)] for x in range(N1)]
u = multiprocessing.Array('i',range(P1))
D = multiprocessing.Array('i',range(N1))
Q = multiprocessing.Array('i',range(N1))
l = [multiprocessing.Lock() for i in range(0,N1)]

初始化后,我创建了P1数量的进程,这些进程对分配的数组有效。但是,我在执行时遇到了这个错误:

File "dijk_inner_mp.py", line 20, in <module>
    l = [multiprocessing.Lock() for i in range(0,N1)]
  File "dijk_inner_mp.py", line 20, in <listcomp>
    l = [multiprocessing.Lock() for i in range(0,N1)]
  File "/usr/lib/python3.4/multiprocessing/context.py", line 66, in Lock
    return Lock(ctx=self.get_context())
  File "/usr/lib/python3.4/multiprocessing/synchronize.py", line 163, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)
  File "/usr/lib/python3.4/multiprocessing/synchronize.py", line 60, in __init__
    unlink_now)
OSError: [Errno 12] Cannot allocate memory

我已经尝试在看到有关该问题的其他一些问题之后增加交换文件大小以表示几个Gb,但这似乎没有帮助。我还将大小从1M减小到131K并最终得到了相同的错误。关于如何规避这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

multiprocessing.Lock()的每个实例都将/dev/shm/中的新信号量文件映射到内存中。

man mmap

  

ENOMEM 过程的最大映射数量已被超出。

(Errno 12定义为ENOMEM。)

系统的最大映射数由内核参数vm.max_map_count控制;你可以用/sbin/sysctl vm.max_map_count阅读它。毫无疑问,您会发现系统上的这个值明显低于您想要创建的锁的数量。

有关改变vm.max_map_count的方法,请参阅e。 G。这Linux Forums thread