首页 > 解决方案 > 在 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();
                    }

标签: c#.net-corebyteconsole-applicationraid

解决方案


我能够通过两个步骤达到 2,5 GB/s 的写入速度:


推荐阅读