如何通过预处理文件来访问 O(1) 中文件中的一行?
How to acces a line in a file in O(1) by preprocessing the file?
在 C++ 中,我想访问文件中的一行。该行包含一个键值对。我没有足够的程序内存来将其存储在地图中,因为值太大。
我想将键在文件中的位置存储在地图中。然后在查询进入时访问它们的值。是否可以在 O(1) 中执行此操作?如果是这样,我应该在 C++ 中使用什么,即 fseek() 等?另外,根据键的位置需要存储什么?
提前致谢。
fseek()
只是在文件中移动 read/write 指针的系统调用;其复杂性完全取决于您的 OS 和您的文件系统,当然还有您的存储设备(例如,在 SSD 上,fseek(x)
将有一个与上一个和新的不变的时间位置,而在磁带驱动器上,事情将取决于相对距离。除非你的 OS 开始在 RAM 中缓存文件内容,一旦你 运行 空闲 RAM 不足,它就会停止)。
您可以考虑将其加载到众多开源 C/C++ 数据库之一,而不是像您描述的那样滚动您自己的文件索引,尤其是因为您的数据被组织为关键-值对,大概有小键和大值或任意值。
一个建议是 Google 的 LevelDB,但还有其他几个不错的选择,具体取决于除性能之外的其他标准。
http://google-opensource.blogspot.com/2011/07/leveldb-fast-persistent-key-value-store.html
大多数应该可以配置为恒定时间访问(或者至少对于所有实际目的来说都足够接近恒定时间)。
在 C++ 中,我想访问文件中的一行。该行包含一个键值对。我没有足够的程序内存来将其存储在地图中,因为值太大。
我想将键在文件中的位置存储在地图中。然后在查询进入时访问它们的值。是否可以在 O(1) 中执行此操作?如果是这样,我应该在 C++ 中使用什么,即 fseek() 等?另外,根据键的位置需要存储什么?
提前致谢。
fseek()
只是在文件中移动 read/write 指针的系统调用;其复杂性完全取决于您的 OS 和您的文件系统,当然还有您的存储设备(例如,在 SSD 上,fseek(x)
将有一个与上一个和新的不变的时间位置,而在磁带驱动器上,事情将取决于相对距离。除非你的 OS 开始在 RAM 中缓存文件内容,一旦你 运行 空闲 RAM 不足,它就会停止)。
您可以考虑将其加载到众多开源 C/C++ 数据库之一,而不是像您描述的那样滚动您自己的文件索引,尤其是因为您的数据被组织为关键-值对,大概有小键和大值或任意值。
一个建议是 Google 的 LevelDB,但还有其他几个不错的选择,具体取决于除性能之外的其他标准。
http://google-opensource.blogspot.com/2011/07/leveldb-fast-persistent-key-value-store.html
大多数应该可以配置为恒定时间访问(或者至少对于所有实际目的来说都足够接近恒定时间)。