2014-06-30 77 views
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) ......在我的情況下,上述更糟的是因爲我在多線程中加載數據。

那麼你看到任何創造性的方式如何解決這個問題?

回答

-1

您是否需要啓動一個外部命令或分叉正在運行的命令?

如果你只需要運行另一個腳本嘗試:

subprocess.call() 

subprocess.call(["ls", "-l"]) 

的os.fork會將您目前的環境,根據您的使用,這可能是不必要的。

不要忘記在使用它之前先導入子流程模塊。

更多信息:

+0

使用subprocess.call()的問題是,它使用os.fork()(其次是事實上通過os.execvp()),然後調用syscall fork()。 Solaris上的系統調用fork(以及沒有啓用內存過量使用的其他U * IX系統)實際上「複製」了包括進程分配的所有內存區域的進程(而以下syscall execvp()實際上釋放了大部分等一下)。因此,如果你的系統存儲器分配了超過1/2的進程,系統調用fork()失敗,不管這個子進程有多小:-( – pez

相關問題