【问题标题】:.Net Write continuously data to the disk in different files.Net 以不同的文件连续将数据写入磁盘
【发布时间】:2016-04-10 13:18:09
【问题描述】:

我们有一个从多个硬件设备中提取数据的应用程序。每个设备的数据应存储在不同的文件中。

目前我们有一个按文件的 FileStream,并在数据到来时进行写入,仅此而已。

我们有很多数据进来,磁盘正在与 HDD(不是 SSD)作斗争,我猜是因为闪存更快,但也因为我们不必一直跳转到不同的文件位置。

默认情况下的一些指标:400 个不同的数据源(每个都应该有自己的文件),每个数据我们收到约 50KB/s(所以 20MB/s)。每个数据源采集同时运行,总共使用了约 6% 的 CPU。

有没有办法组织刷新到磁盘以确保更好的流量?

我们也会考虑改进硬件,但这不是这里真正的主题,因为这是改进我们的读/写的好方法

【问题讨论】:

  • 听起来你需要快写,而且检索允许比较慢。那么为什么不将它存储在一个文件中,或者更好的——一个允许顺序写入的数据库。
  • 没错。为此使用数据库。
  • 伙计们,这不是问题......即使是这样,写入数据库也不会比写入磁盘快,还有通信开销、SQL 开销等等DBMS 开销。即使它更快,它甚至不是一个选择,因为我们有这么多的维护操作,这将使我们一直在赚钱。
  • 我将您的问题解读为:我们的磁盘正在挣扎,因为我们必须到处跳来向其写入数据,我们如何避免这种情况?答案是:按顺序写。通常的实现方式是:将其存储在数据库中。
  • 那么另一种选择:您是否考虑过将数据缓存在例如块中? 10 MB(x 400 数据源 = 4 GB RAM)并在块填满后立即写入整个缓冲区?这避免了为小块数据来回跳转。

标签: c# .net filestream disk hard-drive


【解决方案1】:

Windows 和 NTFS 处理多个并发顺序 IO 流到同一个磁盘的效率非常低。可能,您正遭受随机 IO 的困扰。您需要自己安排更大的 IO。

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

缓冲每个文件的数据,直到你有 16MB。然后,将其冲洗干净。不要同时写入多个文件。这样一来,每个 16MB 段都有一个磁盘寻道,这将寻道开销减少到接近于零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2012-11-01
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多