C#内存映射文件-更好地按顺序读取或写入?
我有两个大约50GB的文件:一个输入文件和一个输出文件。 我正在使用内存映射文件来管理这两个文件 输入文件包含3数百万个网页,在我决定了其中的排列π之后,我必须以新的顺序将网页写入输出文件 因此,我可以选择按顺序读取输入文件,并根据排列π在输出文件的不同位置写入网页C#内存映射文件-更好地按顺序读取或写入?,c#,memory-mapping,C#,Memory Mapping,我有两个大约50GB的文件:一个输入文件和一个输出文件。 我正在使用内存映射文件来管理这两个文件 输入文件包含3数百万个网页,在我决定了其中的排列π之后,我必须以新的顺序将网页写入输出文件 因此,我可以选择按顺序读取输入文件,并根据排列π在输出文件的不同位置写入网页 或者我可以做相反的事情:根据排列π随机读取输入文件,然后将顺序写入输出文件 哪个选项更快?为什么?TL;DR:由于缓存,所有文件附加操作都是连续的。甚至对文件中间的写入也将按块大小进行排序和执行,等等 由于以下几个原因,随机书写往往
或者我可以做相反的事情:根据排列π随机读取输入文件,然后将顺序写入输出文件
哪个选项更快?为什么?TL;DR:由于缓存,所有文件附加操作都是连续的。甚至对文件中间的写入也将按块大小进行排序和执行,等等 由于以下几个原因,随机书写往往比随机阅读更快:
除了“performance rant”链接中的有效点之外,它还将取决于底层硬件。在许多情况下,可能差别不大。只需在您的硬件上同时尝试这两种方法,看看哪一种更快。您确定Windows会在一段不平凡的时间内缓冲写操作吗?这意味着断电或崩溃将导致数据丢失。提供写缓存的硬件通常不会启用缓存,除非存在电池备份以确保完成挂起的写操作。如果操作系统不太关心数据完整性,这将是非常奇怪的。其中一些不适用于SSD存储。@Eric:效果不太明显,但SSD仍然受益于顺序预读。不用说,断电会导致数据丢失。操作系统和文件系统通常试图提供的是写屏障——如果应用程序刷新,那么在屏障写入磁盘之前的所有内容,或者在屏障写入磁盘之后什么都没有。但是,这些保证与RAID不兼容,因此严重的数据库即使在违反这些保证的情况下也具有恢复逻辑。您是否有SSD顺序预读的参考资料?我不是怀疑你,只是好奇。