c# - 在 RAID0 虚拟磁盘上写入大字节数组
问题描述
我有一台每秒产生 20 帧的相机。我用 C# 制作了一个应用程序,它抓取帧并将它们放入并发队列中。我有另一个线程在文件系统上写入帧。每帧都是一个 134184960 字节的数组,我必须在文件系统上写入。文件系统是 RAID0 中 20 个 SSD 的阵列,理论速度为 500 MB/s * 20,瓶颈为 PCiExpress 8x (7,7 GB/s) 生产率约为 2,5 GB/s,但我的写入速度不超过 900 MB/s 我正在使用 Filestream.Write (链接)
我可以做些什么来提高我的写作速度?
private ConcurrentQueue<CapturedFrame> cq = new ConcurrentQueue<CapturedFrame>();
....
try
{
while (cq.TryDequeue(out BufferToWrite))
{
byte[] bufferInBytes = new byte[134184960];
//Matrox function to extract bytes
MIL.MbufGetColor(BufferToWrite.IDFrame, MIL.M_PLANAR, MIL.M_ALL_BANDS, bufferInBytes);
using (FileStream fileStream = new FileStream(Path.Combine(AcquisitionFolder, DateTime.Now.ToString("yyyy-MM-dd-HHmmss-fffffff") + ".raw"), FileMode.Create))
{
fileStream.Write(bufferInBytes, 0, bufferInBytes.Length);
fileStream.Close();
}
}
}
catch (Exception ex)
{
log.Error("Exception: " + ex.Message);
}
将 FileStream 更改为此没有任何改进 65536 = 64K 是 RAID0 阵列的条带大小,我设置了流的长度
using (FileStream fileStream = new FileStream(Path.Combine(AcquisitionFolder, DateTime.Now.ToString("yyyy-MM-dd-HHmmss-fffffff") + ".raw"), FileMode.Create, FileAccess.Write, FileShare.Read, 65536, FileOptions.SequentialScan))
{
fileStream.SetLength(3 * 8192 * 5460);
fileStream.Write(bufferInBytes, 0, bufferInBytes.Length);
fileStream.Close();
}
解决方案
我能够通过两个步骤达到 2,5 GB/s 的写入速度:
- 使用 byte* 指针直接访问内存中的帧
- 如我在https://www.microsoft.com/en-us/download/details.aspx?id=52334之前链接的论文中所述,使用 Span 结构和 FileStream“无缓冲”编写帧
推荐阅读
- python - 如何在抓取页面时形成循环?
- c# - 如何修复 System.AccessViolationException 出现的错误?
- javascript - 如何将数据从 port.on 函数传递到外部变量
- python - 如何合并保存在同一主文件夹中不同子文件夹中的 2000 个 CSV 文件
- html - Bootstrap 导航栏品牌形象垂直居中
- django - 如何在 django 中保存多对多字段
- typescript - Visual Studio Code 中的 TypeScript 运行构建任务失败
- javascript - 按钮单击附加查询字符串
- tensorflow - 如何向 MS COCO 数据集添加一个新类并进行迁移学习以实现更多类?
- matlab - 如何编写具有与 Matlab 脚本兼容的函数定义的单个 Octave 脚本?