在C ++中,我想访问文件中的一行。该行包含一个键值对。我没有足够的程序内存将其存储在地图中,因为值太大。
我想将密钥的位置存储在地图中的文件中。然后在查询进入时访问它们的值。是否可以在O(1)中执行此操作?如果是这样,我应该在C ++中使用什么,即fseek()等?另外,需要根据密钥的位置存储什么?
提前致谢。
答案 0 :(得分:4)
fseek()
只是系统调用,用于在文件中移动读/写指针;其复杂程度完全取决于您的操作系统和文件系统,当然您的存储设备(例如,在SSD上,fseek(x)
将有一个时间不变的最后一个和新的位置,同时在事情将依赖于相对距离。除非您的操作系统开始在RAM中缓存文件内容,否则一旦用完RAM就会停止运行。
答案 1 :(得分:3)
代替按照您的描述滚动自己的文件索引,您可以考虑将其加载到许多开源C / C ++数据库中的一个,特别是因为您的数据被组织为键值对,大概是因为小键和大或任意值。
一个建议是Google的LevelDB,但还有其他一些很好的选择,具体取决于您的其他标准。
http://google-opensource.blogspot.com/2011/07/leveldb-fast-persistent-key-value-store.html
大多数应该可以配置为恒定时间访问(或者至少几乎足以达到所有实际目的的恒定时间)。