技術堆棧:C#/。NET 4 /的WinForms策略需要處理大量的圖像數據的工作
背景:
上我的工作是一系列圖像棧的可視化應用項目。具體而言,每個圖像堆棧都與網格對齊,每次顯示相同的圖像,並將處理功能應用於當前可見的圖像。圖像堆棧本身爲150-300 MB,每個圖像爲512KB-1MB。一個典型的數據集將包含〜100個圖像堆棧。
問:
試着和這個數據量的工作,我用幾個technqiues:
- 內存映射文件:圖像堆棧從磁盤在應用程序啓動
- 彙編下加載帶有不安全代碼的x64:顯然,我需要64位地址空間來存放這種大小的文件。我將當前顯示的圖像從內存映射文件移動到一個方法,該方法通過Marshal.Copy生成位圖並使用不安全的指針。
- System.Threading.Tasks:我使用的並行循環,處理在可能的情況
- System.Drawing.BufferedGraphicsContext:每個圖像堆棧具有被傳遞給一個PictureBox用於顯示給之前合成到一個BufferedGraphicsContext一個活動圖像用戶。
- 高端系統要求:四核以上CPU,SSD,12GB內存等
然而,即使使用所有上述情況,reponsiveness極不理想。使用SysInternals Process Explorer時,CPU利用率很低(< 25%),而內存使用率在垃圾回收發生之前爬升到限制。
分析表明大部分執行時間都是從內存映射文件中獲取數據。我認爲它正在等待操作系統將請求的內存返回到活動內存中?
我還能做些什麼來提高性能?
注:
- 大多數,如果不是全部,圖像棧將在同一時間,以便裁剪到當前視口可能不會產生太大的速度可見。
- 調整大小以顯示是一個選項,但完整的原始數據必須始終可用於處理,因此它似乎只是一個額外的步驟。
更新1:
- 內存,我的開發只有6 GB(我嘗試加載較少的文件作爲一個結果),但部署系統將有24 GB 。
- 我正在研究通過英特爾性能基元和通過CUDA的GPU加速優化SSE。
- 我試圖將所有數據加載到內存中的原因是因爲重要的可視化步驟是以15-60 Hz循環圖像堆棧,並且我害怕抖動。
只是想檢查等價 - 有沒有辦法有很多,這可能只是交給圖形卡而煩惱? – 2012-02-01 21:53:08
「大量的記憶」是給你什麼? – 2012-02-01 21:53:53