【问题标题】:C# Memory Mapped File - Better read or write sequentially?C# 内存映射文件 - 更好地按顺序读取或写入?
【发布时间】:2015-03-22 16:57:42
【问题描述】:

我有两个大约 50GB 的文件:一个 输入 和一个 输出 文件。 我正在使用内存映射文件来管理这两个文件。

input 文件包含 3 百万个网页,在我确定了 排列 π他们,我必须以新的顺序将网页写入 output 文件。

所以,我可以选择顺序读取输入文件,并在输出不同位置写入网页 文件,根据 排列 π。
或者我可以做相反的事情:根据排列 π 随机读取输入文件并写入按顺序进入输出文件。

哪个选项更快?为什么?

【问题讨论】:

  • 除了“性能咆哮”链接中的有效点外,还取决于底层硬件。在许多情况下,差异可能很小。只需在您的硬件上试一试,看看哪个更快。

标签: c# memory-mapping


【解决方案1】:

TL;DR:由于缓存,所有文件追加操作都是顺序的。甚至对文件中间的写入也会按照块大小等进行电梯排序和执行。

出于以下几个原因,随机写入往往比随机读取更快:

  1. 当文件增长时,文件系统可以选择放置新块的位置。
  2. 不必立即执行写入,写入缓冲区可以确保一次写入整个块,这意味着不会将数据添加到已经有位置的现有块中。
  3. 在读取完成之前无法进行处理。阅读依赖于预测缓存。操作系统擅长预缓存顺序读取,这对于随机读取来说很糟糕。如果您的读取小于块大小,情况会更糟——从磁盘读取的实际数据量将大于文件大小。

【讨论】:

  • 您确定 Windows 会在一段不平凡的时间内缓冲写入吗?这意味着断电或崩溃会导致数据丢失。提供写入缓存的硬件通常不会启用缓存,除非存在备用电池以确保待处理的写入完成。如果操作系统不太关心数据完整性,那就太奇怪了。
  • 其中一些不适用于 SSD 存储。
  • @Eric:效果不太明显,但 SSD 仍然受益于顺序预读。不用说,断电会导致数据丢失。操作系统和文件系统通常试图提供的是写屏障——如果应用程序刷新,那么屏障之前的所有内容都会写入磁盘,或者屏障之后什么都没有。然而,这些保证与 RAID 不兼容,因此严重的数据库即使在被违反时也有恢复的逻辑。
  • 您有关于 SSD 的顺序预读的参考吗?我不是怀疑你,只是好奇。
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多