如何通过预处理文件来访问O(1)中文件中的一行

How to acces a line in a file in O(1) by preprocessing the file?

本文关键字:文件 一行 中文 何通过 访问 预处理      更新时间:2023-10-16

在C++中,我想访问文件中的一行。该行包含一个键值对。程序内存不足,无法将其存储在映射中,因为值大小太大。

我想把文件中关键点的位置存储在地图中。然后当查询进入时访问它们的值。在O(1)中可以这样做吗?如果是,我应该在C++中使用什么,例如fseek()等?此外,根据钥匙的位置,需要存储什么?

提前谢谢。

fseek()只是移动文件中读/写指针的系统调用;这完全取决于您的操作系统和文件系统,当然还有您的存储设备(例如,在SSD上,fseek(x)的时间与上一个位置和新位置无关,而在磁带驱动器上,这将取决于相对距离。除非您的操作系统开始在RAM中缓存文件内容,否则一旦用完可用RAM,它就会停止这样做)。

您可以考虑将文件加载到众多开源C/C++数据库中的一个数据库中,而不是像您所描述的那样滚动自己的文件索引,特别是因为您的数据是按键值对组织的,可能有小键和大值或任意值。

一个建议是谷歌的LevelDB,但还有其他几个不错的选择,这取决于你除了性能之外的其他标准。

http://google-opensource.blogspot.com/2011/07/leveldb-fast-persistent-key-value-store.html

大多数应该是可配置的,以实现恒定时间访问(或者至少几乎足以实现所有实际目的的恒定时间)。