.Net 在不同的文件中连续写入数据到磁盘
.Net Write continuously data to the disk in different files
我们有一个应用程序可以从多个硬件设备中提取数据。每个设备的数据应该存储在不同的文件中。
目前我们有一个 FileStream by file 并在数据到来时进行写入,仅此而已。
我们有很多数据进来,磁盘正在与 HDD(不是 SSD)苦苦挣扎,我猜是因为闪存速度更快,但也因为我们不必跳到不同的文件位置时间.
默认情况下的一些指标:400 个不同的数据源(每个都应该有自己的文件),每个数据我们接收 ~50KB/s(所以 20MB/s)。每个数据源采集都是 运行 同时进行的,我们总共使用了 ~6% 的 CPU。
有没有办法组织flush到磁盘以保证更好的流程?
我们也会考虑改进硬件,但这不是真正的主题,因为这是改进我们的好方法 read/write
Windows 和 NTFS 处理多个并发顺序 IO 流到同一个磁盘的效率非常低。可能,您正在遭受随机 IO 的困扰。您需要自己以更大的块来安排 IO。
您可能还会看到极度碎片化。在这种情况下,NTFS 有时会将第 N 个扇区分配给 N 个文件中的每一个。很难相信 NTFS 在这种情况下有多糟糕。
为每个文件缓冲数据,直到达到 16MB。然后,将其冲洗干净。不要同时写入多个文件。这样你就可以为每个 16MB 的段进行一次磁盘寻道,从而将寻道开销减少到接近于零。
我们有一个应用程序可以从多个硬件设备中提取数据。每个设备的数据应该存储在不同的文件中。
目前我们有一个 FileStream by file 并在数据到来时进行写入,仅此而已。
我们有很多数据进来,磁盘正在与 HDD(不是 SSD)苦苦挣扎,我猜是因为闪存速度更快,但也因为我们不必跳到不同的文件位置时间.
默认情况下的一些指标:400 个不同的数据源(每个都应该有自己的文件),每个数据我们接收 ~50KB/s(所以 20MB/s)。每个数据源采集都是 运行 同时进行的,我们总共使用了 ~6% 的 CPU。
有没有办法组织flush到磁盘以保证更好的流程?
我们也会考虑改进硬件,但这不是真正的主题,因为这是改进我们的好方法 read/write
Windows 和 NTFS 处理多个并发顺序 IO 流到同一个磁盘的效率非常低。可能,您正在遭受随机 IO 的困扰。您需要自己以更大的块来安排 IO。
您可能还会看到极度碎片化。在这种情况下,NTFS 有时会将第 N 个扇区分配给 N 个文件中的每一个。很难相信 NTFS 在这种情况下有多糟糕。
为每个文件缓冲数据,直到达到 16MB。然后,将其冲洗干净。不要同时写入多个文件。这样你就可以为每个 16MB 的段进行一次磁盘寻道,从而将寻道开销减少到接近于零。