我對xargs的性能可伸縮性有疑問。目前我有一個批處理程序用python編寫,具有多處理和子進程。每個進程產生一個獨立的subprocess.popen()來執行外部命令。最近我意識到整個過程可以用xargs重做。然而,我不知道用xargs來處理10k +文件是否是個好主意,因爲我以前從來沒有隻用命令行工具做過這樣的縮放。鑑於我對小數據集的測試,如果我所做的只是批量運行一堆命令,實際上並不是一個壞主意,因爲它避免了python模塊所帶來的許多週期開銷,但我想從任何人可能對xargs和python有更多的經驗。更具體地說,是否需要爲xargs配置消耗大量輸入的緩衝區限制?謝謝。xarg與python多進程+子進程的性能
回答
xargs
程序將從標準輸入中收集多個參數,並將它們粘合在一起形成一個長命令行。如果有很多很多參數,對於一個命令行來說太長了,那麼它會根據需要構建和執行多個命令行。
這意味着啓動進程和關閉進程的開銷更小。這會爲你做多少好處取決於你的流程運行多久。如果您正在啓動某種運行半小時的CPU密集型程序,則該過程的啓動時間將是無關緊要的。如果您啓動的程序運行速度很快,但只運行少量實例,那麼節省的費用將無足輕重。但是,如果你的程序真的很平凡,並且需要最少的運行時間,也許你會注意到一個區別。
從你的問題描述來看,這似乎是一個很好的選擇。每個10K的東西處理相對較短。 xargs
可能會加快你的速度。
但是,以我的經驗,在shell腳本中做任何不平凡的工作都會帶來痛苦。如果您有任何目錄名稱或文件名稱可以有空格,引用變量時最輕微的錯誤會導致您的腳本崩潰,所以您需要對您的腳本進行迷戀測試,以確保它適用於所有可能的輸入。出於這個原因,我在Python中完成了我的不重要的系統腳本。因此,如果你已經有你的程序在Python工作,恕我直言,你會瘋狂嘗試將其重寫爲shell腳本。
現在,如果您願意,仍然可以使用xargs
。只需使用subprocess
即可運行xargs
並通過標準輸入傳遞所有參數。這獲得了所有的好處,而沒有任何的痛苦。您可以使用Python在每個參數的末尾添加一個NUL字節chr(0)
,然後使用xargs --null
,並且使用Python在其中包含空格的文件名中強健。
或者,您可以使用' '.join()
來構建您自己的非常長的命令行,但我沒有看到有任何理由這樣做,只要按上述方式運行xargs
即可。
是的,我已經在做其中一個操作的subprocess + xargs方法。操作本身非常簡單,成本不到1秒。我猜這不是一個怎樣的問題,但從規模來看,我還沒有找到任何關於xargs是否有輸入限制的文檔。它看起來只是圍繞輸入打包一個循環,並且能夠以塊的形式執行命令。它是否依賴於任何像緩衝區,我需要配置它以消耗一長串輸入? – ttback
我的理解是,xargs只是消耗標準輸入的參數,並將它們添加到命令行中,直到該行被限制或標準輸入耗盡爲止。一旦達到極限,它將運行該命令,然後開始構建另一個命令行來運行。有一個選項可以讓你設置限制,但我認爲內置的默認設置非常好。所以xargs可以處理任意數量的輸入參數,但是當發生這種情況時可能會多次執行它的命令。更多信息在這裏:http://offbytwo.com/2011/06/26/things-you-didnt-know-about-xargs.html – steveha
是的,我昨天讀到。所以我正在做一個find | xargs類型的操作,我一直有點困惑,我是否需要-s或-L標誌(字符限制與線限制) – ttback
- 1. 持久性python子進程
- 2. 來自Python的子進程:子進程沒有「運行」屬性
- 3. 與Python子進程混淆
- 4. Python - 與子進程通信
- 5. Python與子進程通信
- 6. Python:與子進程回顯
- 7. Python與子進程交互
- 8. Python子進程,給子進程輸入
- 9. Python子進程:鏈接命令與子進程.run
- 10. 寫入python多進程的stdin。進程
- 11. Python關閉所有線程或進程與子進程.Popen
- 12. Python子進程:如何在python中執行進程的子進程?
- 13. Python:用python創建子進程的子進程
- 14. Python子進程OSError
- 15. Python子進程Grep
- 16. 用Python子進程
- 17. Python和子進程
- 18. Python子進程readlines()?
- 19. Python線程和子進程
- 20. Python多進程處理進程名稱
- 21. Python多進程池進程數
- 22. 使用撇號與python的子進程
- 23. Python多處理。與許多進程池
- 24. 多進程與進步
- 25. python子進程使用進口子進程
- 26. 電子 - 主進程與渲染進程
- 27. Python:雖然KeyboardInterrupt被轉發到多進程子進程?
- 28. 多進程Python 3
- 29. 在python多進程
- 30. 跨多個進程的Python threading.Condition()功能
http://ericlippert.com/2012/12/17/performance-rant/ 「如果你有兩匹馬,並且你想知道哪兩匹馬速度更快,那就比賽馬匹吧。馬的簡短描述,在互聯網上發佈,然後讓隨機的陌生人猜猜哪個更快!「 –
我猜'xargs'或'subprocess'的成本會很小,以至於你不會注意到它們的區別。或者,如果存在差異,則將更多地關於哪一個分區最適合的參數組,而不是哪一個具有最小的開銷。但正如基督教的Temus所說,爲什麼猜猜什麼時候才能真正知道答案? – abarnert
我不是問隨機的陌生人,而是對可能有類似問題經歷的人。無論如何感謝時間。 – ttback