我的程序必须处理一个大型数据文件并在内存中创建查找表,以便它可以访问文件中的记录而无需搜索文件。例如,它创建一个结构数组 [name, seekLocation] 并按字母顺序对其进行排序,以便可以实现更快的搜索算法。
不必在每次程序运行时都创建此查找表,是否可以创建一次此表并将其保存到文件中?
当然,一种方法就是这样做。将其保存到文件中并加载它、解析它并在循环中填充结构。
但是说我不想把它保存为需要解析的数据。我想将包含数组的整个内存块保存在原始二进制文件中。然后我可以将文件加载到内存中,定义一个指向该 block 开头的指针并寻址所有元素。
我该怎么做?操作系统或语言是否明确禁止这样做(可能出于安全问题)?如果他们不这样做,是否有一些库或代码可以帮助我做到这一点?
如果可能的话,是否也可以对不连贯的数据(链表)进行处理?
任何指向正确方向的指示都会有所帮助。谢谢。
我在 Linux 中使用 C++。
最佳答案
你说的是序列化/反序列化。
如果实现“已排序”表的主要类可以描述为 protobuf消息那么转储和重新加载阶段将是微不足道的。
主要步骤是:
- 创建一个 myclass.proto文件并描述其中的结构
- 用 protoc 编译 myclass.proto(在 linux 下,安装合适的 protobuf 包)。这应该生成 myclass.pb.cpp 和 myclass.pb.h
- 在包装类中使用此类
- 在包装类中实现“加载”和“保存”
类似的东西:
#include "myclass.pb.h"
class wrapper
{
myclass _protobuf_data;
public:
void load(std::string filename)
{
std::fstream input(filename.c_str(), ios::in | ios::binary);
// add some err managt here (file not exists, etc.)
_protobuf_data.ParseFromIstream(&input); // <<= reload file
}
void save(std::string filename)
{
fstream output(filename.c_str(), ios::in | ios::binary);
_protobuf_data.SerializeToOstream(&output); // <<= save file
}
};
关于c++ - 将内存保存到文件并加载它而无需解析数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44083443/