2013-10-25 191 views
1

我對xargs的性能可伸縮性有疑問。目前我有一個批處理程序用python編寫,具有多處理和子進程。每個進程產生一個獨立的subprocess.popen()來執行外部命令。最近我意識到整個過程可以用xargs重做。然而,我不知道用xargs來處理10k +文件是否是個好主意,因爲我以前從來沒有隻用命令行工具做過這樣的縮放。鑑於我對小數據集的測試,如果我所做的只是批量運行一堆命令,實際上並不是一個壞主意,因爲它避免了python模塊所帶來的許多週期開銷,但我想從任何人可能對xargs和python有更多的經驗。更具體地說,是否需要爲xargs配置消耗大量輸入的緩衝區限制?謝謝。xarg與python多進程+子進程的性能

+1

http://ericlippert.com/2012/12/17/performance-rant/ 「如果你有兩匹馬,並且你想知道哪兩匹馬速度更快,那就比賽馬匹吧。馬的簡短描述,在互聯網上發佈,然後讓隨機的陌生人猜猜哪個更快!「 –

+0

我猜'xargs'或'subprocess'的成本會很小,以至於你不會注意到它們的區別。或者,如果存在差異,則將更多地關於哪一個分區最適合的參數組,而不是哪一個具有最小的開銷。但正如基督教的Temus所說,爲什麼猜猜什麼時候才能真正知道答案? – abarnert

+0

我不是問隨機的陌生人,而是對可能有類似問題經歷的人。無論如何感謝時間。 – ttback

回答

2

xargs程序將從標準輸入中收集多個參數,並將它們粘合在一起形成一個長命令行。如果有很多很多參數,對於一個命令行來說太長了,那麼它會根據需要構建和執行多個命令行。

這意味着啓動進程和關閉進程的開銷更小。這會爲你做多少好處取決於你的流程運行多久。如果您正在啓動某種運行半小時的CPU密集型程序,則該過程的啓動時間將是無關緊要的。如果您啓動的程序運行速度很快,但只運行少量實例,那麼節省的費用將無足輕重。但是,如果你的程序真的很平凡,並且需要最少的運行時間,也許你會注意到一個區別。

從你的問題描述來看,這似乎是一個很好的選擇。每個10K的東西處理相對較短。 xargs可能會加快你的速度。

但是,以我的經驗,在shell腳本中做任何不平凡的工作都會帶來痛苦。如果您有任何目錄名稱或文件名稱可以有空格,引用變量時最輕微的錯誤會導致您的腳本崩潰,所以您需要對您的腳本進行迷戀測試,以確保它適用於所有可能的輸入。出於這個原因,我在Python中完成了我的不重要的系統腳本。因此,如果你已經有你的程序在Python工作,恕我直言,你會瘋狂嘗試將其重寫爲shell腳本。

現在,如果您願意,仍然可以使用xargs。只需使用subprocess即可運行xargs並通過標準輸入傳遞所有參數。這獲得了所有的好處,而沒有任何的痛苦。您可以使用Python在每個參數的末尾添加一個NUL字節chr(0),然後使用xargs --null,並且使用Python在其中包含空格的文件名中強健。

或者,您可以使用' '.join()來構建您自己的非常長的命令行,但我沒有看到有任何理由這樣做,只要按上述方式運行xargs即可。

+0

是的,我已經在做其中一個操作的subprocess + xargs方法。操作本身非常簡單,成本不到1秒。我猜這不是一個怎樣的問題,但從規模來看,我還沒有找到任何關於xargs是否有輸入限制的文檔。它看起來只是圍繞輸入打包一個循環,並且能夠以塊的形式執行命令。它是否依賴於任何像緩衝區,我需要配置它以消耗一長串輸入? – ttback

+0

我的理解是,xargs只是消耗標準輸入的參數,並將它們添加到命令行中,直到該行被限制或標準輸入耗盡爲止。一旦達到極限,它將運行該命令,然後開始構建另一個命令行來運行。有一個選項可以讓你設置限制,但我認爲內置的默認設置非常好。所以xargs可以處理任意數量的輸入參數,但是當發生這種情況時可能會多次執行它的命令。更多信息在這裏:http://offbytwo.com/2011/06/26/things-you-didnt-know-about-xargs.html – steveha

+0

是的,我昨天讀到。所以我正在做一個find | xargs類型的操作,我一直有點困惑,我是否需要-s或-L標誌(字符限制與線限制) – ttback