c ++用于在简单数据库上存储磁盘上的对象数组或向量的最佳方法

时间:2013-10-05 07:44:09

标签: c++ storage

我一直在研究用于安排电视录制的PVR后端,而我正试图找出保留一个包含所有相关信息的简单数据库的最佳方法。我把一个懒人的原型放在一起(如下所示),但是我不想静态地分配大型数组,然后简单地将ram的内容转储到磁盘上进行存储。

鉴于以下懒惰/不良练习原型,我最好的选择是什么?有经验的程序员会选择做这样的事情吗?如果我要在不使用toString / fromString函数的情况下完成所有操作,我该怎么做?

struct Recording{
    Date date;
    int channel;
    int length; //length in hours, minutes, or seconds
    bool is_interlaced; //if true, denotes that the episode is interlaced
    bool done; //if true, denotes that the episode has been recorded
    bool record_successful; //Currently unused
};

struct TV_Episode{
    struct Recording recording;
    char title[128]; //Episode Title
    char season; //Season number
    char episode; //Episode number
};

struct TV_Show{
    char name[64]; //TV Show name
    char numepisodes; //The number of episodes in the array
    struct TV_Episode episodes[100]; //Array containing airings of a TV show
};

struct Movie{
    struct Recording recording;
    char title[128]; //Movie Title, optionally including the year in brackets
};

struct Recordings_DB{ /*
    * Obviously these types can be done away with using inheritance
    * and the Recordings_DB type can be done away with using a vector.
    * They are just here to illustrate the concept.
    */
    struct TV_Show shows[20];
    struct Movie movies[20];
};

3 个答案:

答案 0 :(得分:0)

如果您不想静态分配数组,那么为什么不使用std::stringstd::vector?您可以动态分配到正确的大小,并且您对最大大小没有限制。这是双赢。

也不要将char用于整数值。那种便士捏是不必要的。它只会回来咬你。还记得Y2K吗?信不信由你现代计算机有大量的内存和磁盘空间。在许多情况下,由于填充,你实际上并没有节省任何内存。

答案 1 :(得分:0)

它可能会有点烦人,因为您需要编写自己的序列化代码(tostring / fromstring)或采用库。如果您自己编写,请务必考虑将字段添加到其中一个结构但希望能够以旧格式读取的情况;提前规划有助于解决这个问题。

您可能考虑的两个选择是Google的协议缓冲库(您可以定义协议缓冲区而不是结构,然后您可以序列化顶级的RecordingsDB)或SQLite(您必须编写一些基本的SQL来填充字段,但你也得到索引和交易)。如果您的数据库永远不会超过几千条记录,我建议使用协议缓冲区,因为SQL不会给您带来太多好处。两者都是相当紧凑,简单的库,得到了很好的支持。

答案 2 :(得分:0)

我实际上在PVR机顶盒世界工作了5年以上,而在我的旧公司,我们面临着类似的选择。由于您的目的是将PVR记录存储在磁盘上,以下是您可以采取的一些方法 -

  1. 二进制协议:将C或C ++ POD类型转储为二进制文件。这将需要在添加/删除字段时难以保持兼容性的自定义解析器。也不是人类可读的,所以调试将是一个痛苦。如果您出于速度或磁盘使用原因而采用此路由,请至少使用Google的protocol buffers作为二进制协议。
  2. 序列化协议使用XML,JSON等人类可读协议将数据序列化到磁盘或从磁盘序列化。易于调试,还可以向架构添加/删除字段。许多开源解析器可用,例如expat,libxml2,rapidjson,json-c,可以为你做繁重的工作。
  3. 嵌入式数据库如果您的系统需要支持排序,搜索,过滤等,我强烈推荐SQlite,这是一个适用于具有本机C接口的嵌入式平台的轻量级数据库。此选项需要提前进行更多的开发工作,但随着系统的发展,可以更好地扩展。