如何通过预处理文件来访问O(1)中文件中的一行
How to acces a line in a file in O(1) by preprocessing the file?
在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
大多数应该是可配置的,以实现恒定时间访问(或者至少几乎足以实现所有实际目的的恒定时间)。
相关文章:
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何使代码打印文本文件中的第一行?
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 将字符串存储到文件下一行的变量中
- 为什么这个.c文件只有一行"../xx/xx.c"?
- 比较两个没有一行共同点的大文件
- 如何在c ++中以一行(水平)打印两个文件的数据?如给定的.这两种形式来自两个不同的文本文件
- 到达分隔符时跳到文本文件的下一行
- 从文本文件中读取一行并将其存储在 C++ 中的 2D 矢量中
- 从文本文件中随机选取一行
- 在获取从文件到矢量的每一行之后,数字将被更改或销毁
- 从文件中的一行读取特定数据-C++
- 从文本文件中的每一行读取数字,并计算数字重复的次数
- 为什么这一行不输出我的文本文件?
- 如何有效地从文件一行又一行地读取数据(相同类型)到多个向量(vectros的向量)
- 将文件一行的每个元素转换为整数
- 将文本文件一行一行地读入并行数组