性能问题:大numpy数组和系统调用

ego*_*den 3 python memory performance numpy

在预分配大量内存(例如numpy数组)后使用系统调用时会出现性能问题.问题随着内存的增加而增加.

test.py:

import os
import sys
import time
import numpy

start = time.clock()
test = int(sys.argv[1])
a = numpy.zeros((test,500,500))
for i in range(test) :
    os.system("echo true > /dev/null")
elapsed = (time.clock() - start)
print(elapsed)
Run Code Online (Sandbox Code Playgroud)

每次迭代时间急剧增加:

edouard@thorin:~/now3/code$ python test.py 100
0.64
edouard@thorin:~/now3/code$ python test.py 200
2.09
edouard@thorin:~/now3/code$ python test.py 400
14.26
Run Code Online (Sandbox Code Playgroud)

这与虚拟内存无关.这是一个已知的问题吗?

NPE*_*NPE 5

os.system()在分配了大型NumPy阵列之后,您似乎已将问题缩小到需要更长时间.

在封面下,system()用途fork().尽管fork()应该是非常便宜的(由于它使用了复制),但事实并非如此简单.

特别是Linux fork()存在大型流程需要更长时间的问题.例如,见:

这两份文件都相当陈旧,所以我不确定最先进的是什么.但是,有证据表明您遇到过这种问题.

如果你无法摆脱这些system()电话,我会建议两种研究途径:

  • 考虑启用大页面.
  • 考虑在启动时产生辅助进程的可能性,其工作是调用必要的system()命令.