【发布时间】:2016-07-20 22:20:49
【问题描述】:
我有一个非常大的文件 150 GB。我使用只读mmap 并对文件执行二进制搜索。
目前二分查找执行速度很慢。
但是我正在考虑进行以下优化 - 当我检查(磁盘搜索)某个值时,“围绕”该值的所有值都已经进入内存,因为它们属于同一个磁盘块。我可以检查“接近”值并在此之后跳转,而不是跳转到文件中的其他位置。
这种优化值得吗?
还有我如何估计磁盘块“结束”的位置。
【问题讨论】:
我有一个非常大的文件 150 GB。我使用只读mmap 并对文件执行二进制搜索。
目前二分查找执行速度很慢。
但是我正在考虑进行以下优化 - 当我检查(磁盘搜索)某个值时,“围绕”该值的所有值都已经进入内存,因为它们属于同一个磁盘块。我可以检查“接近”值并在此之后跳转,而不是跳转到文件中的其他位置。
这种优化值得吗?
还有我如何估计磁盘块“结束”的位置。
【问题讨论】:
您偶然发现了导致B-tree 数据结构的推理路线。您想象的优化是值得做的,但要尽可能多地利用它,您需要大量重组磁盘上的数据并使用比二分查找更复杂的算法。您可能应该研究现有的开源 B 树库,而不是从头开始实施。
因为你使用的是mmap,所以访问的最小粒度不是磁盘块大小,而是内存“页”大小,可以用sysconf(_SC_PAGESIZE)查询。一些操作系统会在随机访问文件支持的区域时读取并填充更大的内存块,但我不知道有任何可移植的方式来找出多少。您还可以从madvise(MADV_RANDOM) 中获得一些好处。
【讨论】:
madvise(MADV_RANDOM) 将速度提高 60%。不错,但还是很慢。