【发布时间】:2012-02-01 21:42:53
【问题描述】:
技术栈:C#/.NET 4/WinForms
背景:
我正在从事的项目是一系列图像堆栈的可视化应用程序。具体来说,每个图像堆栈都对齐到一个网格,在任何时候显示相同的图像,并对当前视图中的图像应用处理函数。图像堆栈本身为 150-300 MB,每个图像为 512KB-1MB。一个典型的数据集将包含约 100 个图像堆栈。
问题:
为了尝试处理这么多的数据,我使用了几种技术:
- 内存映射文件:图像堆栈在应用程序启动时从磁盘加载
- 在 x64 下编译允许不安全代码:显然我需要 64 位地址空间来存储这种大小的文件。我正在将当前显示的图像从内存映射文件移动到通过 Marshal.Copy 使用不安全指针生成位图的方法。
- System.Threading.Tasks:我尽可能使用并行循环进行处理
- System.Drawing.BufferedGraphicsContext:每个图像堆栈都有一个活动图像,该图像在传递到 PictureBox 以显示给用户之前合成到 BufferedGraphicsContext。
- 高端系统要求:四核 CPU 或更高、SSD、12GB 内存等
然而,即使使用上述所有方法,响应性仍有很多不足之处。使用 SysInternals Process Explorer,CPU 使用率很低 (
分析表明,大部分执行时间都花在了从内存映射文件中获取数据上。我假设它正在等待操作系统将请求的内存分页回活动内存?
我还能做些什么来提高性能?
注意:
- 大多数(如果不是全部)图像堆栈将同时可见,因此剪辑到当前视口可能不会产生很大的速度。
- 调整显示大小是一种选择,但完整的原始数据必须始终可用以进行处理,因此这似乎只是一个额外的步骤。
更新 1:
- 对于内存,我的开发盒只有 6 GB(因此我试图加载更少的文件),但部署系统将有 24 GB。
- 我正在研究通过英特尔性能基元和通过 CUDA 的 GPU 加速来使用 SSE 优化。
- 我之所以尝试将所有数据加载到内存中,是因为一个重要的可视化步骤是以 15-60 Hz 的频率在图像堆栈中循环,我害怕颠簸。
【问题讨论】:
-
只是想检查一下 - 有没有办法很多这些都可以交给显卡来担心?
-
“大量内存”对你来说是什么?
标签: c# .net memory-management image-processing parallel-processing