最近仍然做了一些工作,也取得一些进展。整个代码也已经完成。
思路是这样的:
首先我仍然在内存中记录我的预触发数据,因为预触发是很关键的,只有通过内存缓存的方式才能记录超长的预触发数据,但内存是有限的,现在的台式机最大也只能到达128GB,如果以1GB的采样率进行采集,128GB对于四个通道来说,也只能存储16s的数据,当然16s也是不可能的,因为你的代码的其他函数会占用内存,比如你写文件时,fwrite只能先将数据写入标准I/O缓冲区中,再通过fflush从I/O缓冲区中写入kernel的page cache中,而这个缓冲区是会占用内存大小的。
保留了之前写的预触发数据之后,再就是实时硬盘流了,其实实时硬盘流是很难实现的,尤其是对于高采样率来说,首先我的PC的主板最高只支持PCIe3.0 x16的传输速度,现在市面上最高的使用PCIe3.0的SSD写入速度为4100MB/s(Western Digital 西部数字 AN1500 4TB PCIe Gen3 x 8 (读取最大6,500MB/秒) WD Black SSD 存储卡 WDS400T1X0L-EC)。见下图,是x8的,但是我的主板上已经没有多余的x8槽可以支持这个。而且最重要的是4100MB/s的速度是峰值速度,能不能达到吧,那就是另外一回事了 。
我对我现有的设备做了一些测试,比如测试了SSD的读写速度,我现在用的是V-NAND SSD 970EVO Plus NVMe M.2 250GB,这种的峰值速度理论上可以达到3100MB/s,如果我没有记错的应该是这个值,但是随着SSD的使用次数的增多,随着不断写入导致的硬盘发热等一些原因,写入速度越来越慢,目前测试只有1.1GB/s,所以就算我在PCIe3.0上搭载了西数的这块SSD,也很难保证平均速度一直保持在4GB以上,因为我目前想实现的是500M的采样率,实时硬盘流。
但是,峰回路转,由于现在的技术发展的比较快,已经进入了PCIe5.0,但还没有大规模的使用,现在最高使用的就是PCIe4.0,能够大幅的提升硬盘的写入速度,于是乎我找到了他-Seagate FireCuda 530 M.2 2TB PCIe Gen4x4 ,读取速度7300MB/s,见下图,2T的存储量,可以实现我8分钟的存储,而写入速度也足以支持我实时的硬盘流,但仍然有风险,具体原因跟我上面提到的一样,但是价格太贵了,我在犹豫需要花这么大的代价去做,并且我还需要更换支持PCIe4.0的主板。
当然下面这款西数的也可以,SN850X 2TB PCIe Gen4×4 NVMe,自带散热器,写入速度为6600MB/s,而且价格较上面那款略便宜一些。
所以这就是整个思路,在更换硬件的前提下,也许能实现,但有风险,也需要进一步的尝试。
实现预触发内存记录数据可以看之前的帖子:
通过GageStream2Disk记录超长预触发数据-已实现_Y.QL19CAS的博客-CSDN博客
下一篇我想谈谈如何在linux下用c提高文件写入的效率,从而实现更高效的记录数据。