我已经阅读了很多关于尝试分配超过 1GB 内存的 SO 帖子和一般文章,所以在像其他人一样被击落之前,这里有一些上下文。
此应用程序将作为信息亭运行,专用机器不运行不必要的进程。
我的应用程序以 1920 x 1080 的分辨率和 24 位深度从具有滚动快门的高速相机获取图像,速度为每秒 120 帧。应用程序需要将每一帧写入磁盘以进行后期处理. 我目前面临的问题是磁盘 I/O 无法跟上捕获速率,即使它被限制为每秒 120 帧。所需的磁盘 I/O 带宽约为 750MBps!
原始记录的总长度至少需要 10 秒 (7.5GB)。执行任何即时转码或压缩都会将帧速率降至完全不可接受的水平。
为了解决这个问题,我尝试了以下方法:
- 通过将硬件级别的位深度降低到 16(仍约为 500MBps)来降低质量。
- 禁用所有图像编码并将原始相机数据写入磁盘。这节省了一些处理时间。
- 在磁盘上创建一个 10GB 的文件,并在帧进入时进行顺序写入。到目前为止,这很有帮助。所有开发和生产系统都有一个用于此应用程序的 100GB 专用驱动器。
- 使用 Sysinternals 的 Contig.exe 对文件进行碎片整理。这在非 SSD 驱动器上取得了惊人的收益。
这里没有可供探索的选择。我不熟悉内存映射文件,在尝试创建它们时,我得到一个 IOException 说Not enough storage is available to process this command.
。
using (var file = MemoryMappedFile.CreateFromFile(@"D:\Temp.VideoCache", FileMode.OpenOrCreate, "MyMapName", int.MaxValue, MemoryMappedFileAccess.CopyOnWrite))
{
...
}
我目前使用的大文件需要顺序写入或顺序读取访问。任何指针将不胜感激。
如果有办法分配这么多 RAM,我什至可以将整体记录大小降低到 1.8GB。再一次,这将在具有 8GB 可用内存和 100GB 可用空间的专用设备上运行。但是,并非所有生产系统都将配备 SSD 驱动器。