0
我有一個python腳本,需要通過調用外部命令的lot's來加載很多數據。 了幾個小時後,這個總是與這個崩潰:在Python中調用外部命令的高效內存
....
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
File "/usr/lib/python2.6/subprocess.py", line 621, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1037, in _execute_child
self.pid = os.fork()
OSError: [Errno 12] Not enough space
abort: Not enough space
...即使機器就具有比腳本可用更多的內存是 實際使用。
根本原因似乎是,每個fork()的實際需要相比,立即被調用exec()的發佈父進程兩倍的內存 (見:http://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html) ......在我的情況下,上述更糟的是因爲我在多線程中加載數據。
那麼你看到任何創造性的方式如何解決這個問題?
使用subprocess.call()的問題是,它使用os.fork()(其次是事實上通過os.execvp()),然後調用syscall fork()。 Solaris上的系統調用fork(以及沒有啓用內存過量使用的其他U * IX系統)實際上「複製」了包括進程分配的所有內存區域的進程(而以下syscall execvp()實際上釋放了大部分等一下)。因此,如果你的系統存儲器分配了超過1/2的進程,系統調用fork()失敗,不管這個子進程有多小:-( – pez