不断地将数据写入磁盘的不同文件(.Net)

3
我们有一个从几个硬件设备中提取数据的应用程序。每个设备的数据都应存储在不同的文件中。
目前,我们对于每个文件使用一个 FileStream,并在数据到来时进行写操作,就这样。
大量数据正在涌入,由于磁盘是HDD(而不是SSD),所以出现了问题,我猜这是因为闪存更快,但也因为我们不必一直跳转到不同的文件位置。
默认情况下的一些指标:有400个不同的数据源(每个都应有自己的文件),并且我们每秒接收约50KB的数据(因此为20MB/s)。每个数据源采集都是并发运行的,总共使用了约6%的CPU。
有没有一种方法可以组织刷新到磁盘,以确保更好的流动性?
我们还将考虑改善硬件,但这并不是这里的主题,因为它是改善我们的读/写的好方法。

1
听起来你需要快速写入,而检索可以相对较慢。那么为什么不将其存储在一个文件中,或者更好的是 - 一个允许顺序写入的数据库中。 - CompuChip
1
没错,针对这个问题使用数据库。 - Kosala W
1
伙计们,这不是问题所在...即使是这种情况,写入数据库也不可能比写入磁盘更快,因为存在通信开销、SQL开销和所有DBMS开销。 即使它更快,由于我们有如此多的维护操作,这甚至都不是一个选项,因为这些操作会让我们失去所有节省的时间。 - J4N
我理解你的问题是:我们的磁盘因为需要在不同位置写入数据而出现了困难,我们该如何避免这种情况?答案是:按顺序写入。通常实现的方法是:将其存储在数据库中。 - CompuChip
1
还有另一种选择:您是否考虑将数据分块缓存,例如每个块为10 MB(x 400个数据源=4 GB RAM),并在块填满时将整个缓冲区写入?这样可以避免为小数据片段来回跳转。 - CompuChip
显示剩余5条评论
1个回答

3

Windows和NTFS对于同一磁盘的多个并发顺序IO流处理非常低效。很可能你正在遭受随机IO的困扰。你需要自己安排更大数据块的IO。

你可能还会看到极端碎片化。在这种情况下,NTFS有时会将每个N个扇区分配给N个文件中的每一个。很难相信在这种情况下NTFS是多么的糟糕。

对于每个文件缓冲数据直到有16MB,然后刷新它。不要同时写入多个文件。这样,每个16MB段都只需要进行一次磁盘搜索,从而将搜索开销减少至接近零。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接