Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#内存映射文件-更好地按顺序读取或写入?_C#_Memory Mapping - Fatal编程技术网

C#内存映射文件-更好地按顺序读取或写入?

C#内存映射文件-更好地按顺序读取或写入?,c#,memory-mapping,C#,Memory Mapping,我有两个大约50GB的文件:一个输入文件和一个输出文件。 我正在使用内存映射文件来管理这两个文件 输入文件包含3数百万个网页,在我决定了其中的排列π之后,我必须以新的顺序将网页写入输出文件 因此,我可以选择按顺序读取输入文件,并根据排列π在输出文件的不同位置写入网页 或者我可以做相反的事情:根据排列π随机读取输入文件,然后将顺序写入输出文件 哪个选项更快?为什么?TL;DR:由于缓存,所有文件附加操作都是连续的。甚至对文件中间的写入也将按块大小进行排序和执行,等等 由于以下几个原因,随机书写往往

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

输入文件包含3数百万个网页,在我决定了其中的排列π之后,我必须以新的顺序将网页写入输出文件

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


哪个选项更快?为什么?

TL;DR:由于缓存,所有文件附加操作都是连续的。甚至对文件中间的写入也将按块大小进行排序和执行,等等

由于以下几个原因,随机书写往往比随机阅读更快:

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

  • 除了“performance rant”链接中的有效点之外,它还将取决于底层硬件。在许多情况下,可能差别不大。只需在您的硬件上同时尝试这两种方法,看看哪一种更快。您确定Windows会在一段不平凡的时间内缓冲写操作吗?这意味着断电或崩溃将导致数据丢失。提供写缓存的硬件通常不会启用缓存,除非存在电池备份以确保完成挂起的写操作。如果操作系统不太关心数据完整性,这将是非常奇怪的。其中一些不适用于SSD存储。@Eric:效果不太明显,但SSD仍然受益于顺序预读。不用说,断电会导致数据丢失。操作系统和文件系统通常试图提供的是写屏障——如果应用程序刷新,那么在屏障写入磁盘之前的所有内容,或者在屏障写入磁盘之后什么都没有。但是,这些保证与RAID不兼容,因此严重的数据库即使在违反这些保证的情况下也具有恢复逻辑。您是否有SSD顺序预读的参考资料?我不是怀疑你,只是好奇。