c++ - 将内存保存到文件并加载它而无需解析数据?

标签 c++ linux memory-management

我的程序必须处理一个大型数据文件并在内存中创建查找表,以便它可以访问文件中的记录而无需搜索文件。例如,它创建一个结构数组 [name, seekLocation] 并按字母顺序对其进行排序,以便可以实现更快的搜索算法。

不必在每次程序运行时都创建此查找表,是否可以创建一次此表并将其保存到文件中?

当然,一种方法就是这样做。将其保存到文件中并加载它、解析它并在循环中填充结构。

但是说我不想把它保存为需要解析的数据。我想将包含数组的整个内存块保存在原始二进制文件中。然后我可以将文件加载到内存中,定义一个指向该 block 开头的指针并寻址所有元素。

我该怎么做?操作系统或语言是否明确禁止这样做(可能出于安全问题)?如果他们不这样做,是否有一些库或代码可以帮助我做到这一点?

如果可能的话,是否也可以对不连贯的数据(链表)进行处理?

任何指向正确方向的指示都会有所帮助。谢谢。

我在 Linux 中使用 C++。

最佳答案

你说的是序列化/反序列化。

如果实现“已排序”表的主要类可以描述为 protobuf消息那么转储和重新加载阶段将是微不足道的。

主要步骤是:

  1. 创建一个 myclass.proto文件并描述其中的结构
  2. 用 protoc 编译 myclass.proto(在 linux 下,安装合适的 protobuf 包)。这应该生成 myclass.pb.cpp 和 myclass.pb.h
  3. 在包装类中使用此类
  4. 在包装类中实现“加载”和“保存”

类似的东西:

#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/

相关文章:

python - 不使用 sudo 运行特定进程

ios - 如果应用程序意外崩溃,是否释放我的 iOS 应用程序使用的所有内存?

memory-management - Zend_Cache 反序列化 - 内存占用?

c++ - 在运行时管理共享库之间的 Boost::any

C++11 正则表达式抛出 std::regex_error

c++ - OpenGL 冒名顶替者球体 : problem when calculating the depth value

linux - 在 bash 中执行 "[]"给出了一个奇怪的错误消息.. 为什么?

linux - 如何通过网络访问Raspberry PI QEMU VM

c++ - 为什么尝试在模板中使用纯虚函数构建 C++ 代码时会出现链接器错误?

c++ - 标量对象 '***' 在初始值设定项中需要一个元素