背景
在批量處理大型文件(如高分辨率圖片、視頻片段、科學數據塊)時,開發者通常希望利用多核CPU并行計算以提升處理效率。然而,如果每個任務對象的數據量很大,直接批量并發處理極易導致系統內存被迅速耗盡,出現程序假死、崩潰,甚至系統級“死機”。
Qt自帶的線程池(QThreadPool)適合并發處理大量輕量級任務,但對大文件/大數據對象的場景,若不做額外控制,任務隊列/參數內存消耗同樣可能壓垮主機。
挑戰分析
-
數據體積巨大:每個任務的數據量(如一張影像)可達數百兆甚至更大。
-
并發數失控:批量提交任務時,線程池外部或內部的隊列可能導致過多任務對象和數據駐留內存。
-
任務參數和中間變量堆積:即使線程池限制了活躍線程,未調度到的任務的參數對象同樣駐留內存。
-
異常與資源釋放:異常時資源未被及時回收,進一步增加內存風險。
設計原則
-
嚴格限制并發任務數,防止同時處理過多大對象導致內存溢出。
-
避免批量創建所有任務對象,每次只投遞有限數量任務,處理完再補充。
-
所有大內存對象及時主動釋放,任何情況下都不能遺留大塊內存。
-
通用并跨平臺的設計思路,適應不同操作系統的資源