我們需要處理的各種目錄中有大約500GB的圖像。每個圖像的大小約為4MB,我們有一個python腳本,一次處理一個圖像(它讀取元數據並將其存儲在數據庫中)。每個目錄可能需要1-4小時才能處理,具體取決於大小。
我們可以在GNU / Linux操作系統上使用2.2Ghz四核處理器和16GB RAM。當前腳本僅使用一個處理器。利用其他內核和RAM來更快地處理圖像的最佳方法是什么?啟動多個Python進程來運行腳本會利用其他內核嗎?
另一個選擇是使用Gearman或Beanstalk之類的東西將工作分配給其他機器。我已經看了多處理庫但不知道如何利用它。
解決方案
啟動多個Python進程來運行腳本會利用其他內核嗎?
是的,如果任務受CPU約束,它將會。這可能是最簡單的選擇。但是,不要為每個文件或每個目錄生成單個進程; 考慮使用像這樣的工具,parallel(1)
並讓它產生每個核心兩個進程的東西。
另一個選擇是使用Gearman或Beanstalk之類的東西將工作分配給其他機器。
那可能有用。另外,看看ZeroMQ的Python綁定,它使分布式處理變得非常簡單。
我已經看了多處理庫但不知道如何利用它。
比如定義一個函數,process
它讀取單個目錄中的圖像,連接到數據庫並存儲元數據。讓它返回一個表示成功或失敗的布爾值。我們directories
是目錄處理的列表。然后
import multiprocessing pool = multiprocessing.Pool(multiprocessing.cpu_count()) success = all(pool.imap_unordered(process, directories))
將並行處理所有目錄。如果需要,您還可以在文件級執行並行操作; 這需要更多的修修補補。
請注意,這將在第一次失敗時停止; 使其容錯需要更多的工作。
本文首發於python黑洞網,博客園同步更新