在非常大的文件上优化 mmap

optimizing mmap on very large file

我有一个 150 GB 的非常大的文件。我使用只读 mmap 并对文件执行二进制搜索。

目前二分查找执行的很慢。

但是我正在考虑以下优化 - 当我检查(磁盘查找)某个值时,所有值 "around" 这个值已经进入内存,因为它们属于同一个磁盘块。我可以检查 "near" 值并在之后跳转,而不是跳转到文件中的其他地方。

这个优化值得做吗?

还有我如何估计磁盘块所在的位置 "ends"。

您偶然发现了导致 B-tree 数据结构的推理线。您想象的优化 值得做的,但是要尽可能多地利用它,您将需要大量重组磁盘上的数据并使用比二进制搜索更复杂的算法。您可能应该查看现有的开源 B 树库,而不是从头开始实施。

因为你使用的是mmap,访问的最小粒度不是磁盘块大小,而是内存"page"大小,可以用sysconf(_SC_PAGESIZE). Some OSes will read and populate a larger chunk of memory on random access to a file-backed region, but I don't know of any portable way to find out how much. You might also get some benefit from madvise(MADV_RANDOM)查询。