我有一个非常大的文件150 GB。我使用只读mmap
并在文件中执行二进制搜索。
目前二进制搜索执行速度很慢。
然而,我正在考虑进行优化 - 当我检查(磁盘搜索)某些值时,所有值"围绕"此值已经存入内存,因为它们属于同一个磁盘块。我可以检查"附近"而不是跳到文件中的其他位置。之后的数值和跳跃。
这种优化值得吗?
另外,我如何估计磁盘块的结束位置"。
答案 0 :(得分:6)
您偶然发现了导致B-tree数据结构的推理线。你想象的值得做的优化是值得做的,但为了尽可能多地获取它,你需要大量重新组织磁盘上的数据并使用比二进制搜索更复杂的算法。您应该查看现有的开源B树库,而不是从头开始实现。
因为您使用的是mmap
,所以访问的最小粒度不是磁盘块大小,而是内存“页面”大小,可以使用sysconf(_SC_PAGESIZE)
查询。一些操作系统会在随机访问文件支持的区域时读取和填充更大的内存块,但我不知道有任何可移植的方法来查明多少。您也可以从madvise(MADV_RANDOM)
获得一些好处。