我已经阅读了很多SO帖子和有关尝试分配超过1GB内存的一般文章,因此在像其他文章一样被拒绝之前,这里有一些介绍。

该应用程序将作为自助服务终端运行,专用机器不会运行不必要的进程。

我的应用程序从带有滚动快门的高速相机以120帧/秒的速度获取图像,分辨率为1920 x 1080,位深度为24。该应用程序需要将每个帧都写入磁盘以进行后处理。我目前面临的问题是,即使磁盘I / O被限制为每秒120帧,也无法跟上捕获速度。所需的磁盘I / O带宽约为750MBps!

原始记录的总长度至少应为10秒(7.5 GB)。执行任何即时转码或压缩会将帧速率降低到完全无法接受的水平。

要变通解决此问题,我尝试了以下方法:


通过将硬件级别的位深度减小到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驱动器。

最佳答案

64位系统上的32位进程可以分配4 GB的RAM,因此应该有可能获得1.8 GB的RAM用于存储视频,但是,当然,您需要考虑加载的DLL和缓冲区,直到视频被压缩为止。

除此之外,您可以使用RAMDisk,例如来自DataRam。您只需要在应用程序需要多少内存和可以授予磁盘多少内存之间找到平衡。恕我直言,5 GB / 3 GB设置可以很好地工作:操作系统为1 GB,应用程序为4 GB,文件为3 GB。

如果您要永久保存文件,请不要忘记将文件从RAM磁盘复制到HDD。

07-25 23:37