代码之家  ›  专栏  ›  技术社区  ›  Bas Bossink

版本控制友好、可扩展的二进制文件格式

  •  12
  • Bas Bossink  · 技术社区  · 15 年前

    在我目前正在进行的项目中,需要将一个相当大的数据结构保存到磁盘(编辑:想想几十MB)。作为一个乐观主义者,我认为对于这样的问题必须有一个标准的解决方案;但是,到目前为止,我还没有找到满足以下要求的解决方案:

    1. .NET2.0支持,最好使用FOSS实现
    2. 版本友好(这应该解释为:如果底层数据结构的更改很简单,比如添加/删除字段,那么读取旧版本的格式应该相对简单)
    3. 能够进行某种形式的随机访问,其中部分数据可以在初始创建后扩展,而无需反序列化到此时为止创建的集合(将此视为扩展中间结果)
    4. 节省空间和时间(考虑到这一要求,XML作为选项被排除在外)

    目前考虑的选择:

    我们非常感谢您的推荐和指点。此外,如果您认为上述任何信息不真实,请提供指针/示例来证明我的错误。

    7 回复  |  直到 14 年前
        1
  •  6
  •   Thomas    15 年前

    你考虑过用 SQL Server Compact Edition ?

    1. 它有很多.net支持
    2. 模式的版本控制和应用程序处理旧模式的新版本的能力将完全由您控制。除了使用旧版本中不存在的较新版本中的功能之外,SQL Server Compact的版本控制应该看起来有些微不足道。
    3. 您拥有可用于查询的大部分sql语法。
    4. 显然,从名称上看,此版本的SQL Server是为嵌入式系统设计的,这些嵌入式系统可以包含希望避免安装SQL Express或SQL Server的完整版本的应用程序。

    现在,这将有与sqlite相同的问题,因为数据结构,从你告诉我们的,可能会变得复杂,但这将是正确的,即使你滚动你自己的二进制格式。

    顺便说一句,我突然想到你还没有弄清楚“相当大”到底是什么意思。如果“sizeable”意味着接近或超过4gb,那么很明显,sql compact将不起作用,许多其他数据库文件格式也不会起作用。

    编辑 我注意到,在我的文章之后,您已经将sql compact版本添加到了“太重”列表中。根据数据库的大小,sql compact只需要5mb的ram和2mb的磁盘存储空间。所以,问题不可能是重量级的。现在,关于声称数据结构的第二点是相当复杂的。如果这是真的,我怀疑任何关系数据库产品都会是真的,并且滚动您自己的二进制格式将更加复杂。因此,您可以查看非关系数据库产品,如 mongodb .

        2
  •  1
  •   Barry Wark    15 年前

    你会考虑(b)json吗?如果是这样,其中一个面向文档的数据库可能适合您的需要。 CouchDB 是一个带有rest api的json文档存储(绝对可以从.net使用)。couchdb文档可以有二进制附件,我和那些在文档中存储了多mb附件而没有问题的人谈过。我相信 MongoDB ,另一个使用二进制json作为存储格式的文档数据库也具有.net绑定。

    这些“nosql”选项很容易进行版本控制,因为它们本质上是无模式的。json是非常紧凑的,而且它们肯定允许对现有数据进行更新。

        3
  •  1
  •   Jon M    15 年前

    你有没有想过 db4o ?许可证可能会限制您,但如果不是这样,它似乎符合法案。

        4
  •  1
  •   Etamar Laron    15 年前

    这里有一个有趣的选择:从思科蚀刻,在apache许可下可用(你不支付版税,你的软件仍然是商业的和你的)。

    这个想法是使用蚀刻在系统组件之间以二进制形式进行通信。该格式对版本更改具有弹性,并且可以根据您的需求状态处理缺少的字段等。

    这样做的好处是,您可以在二进制格式的基础上获得更完整的传输系统。它被认为非常快(一台机器每秒执行900个soap xml事务,生成50000个蚀刻事务)。

    如果需要多个索引,可以将二进制形式存储在轻量级rdbms中。如果只有一个索引就足够了,那么一个简单的键/值存储(couchdb/mongodb甚至cassandra用于分布式环境)也将为您提供出色的存储性能!

        5
  •  0
  •   Zach Johnson    15 年前

    如果XML由于空间消耗而不能满足需求,可以通过 System.IO.Compression.DeflateStream 缩小它的尺寸。这个 Deflate 算法与 GZip 压缩,但速度可高达40%(请参见 Jeff Atwood's blog )

        6
  •  0
  •   Peter K.    15 年前

    我不会这么快就注销协议缓冲区的。当然,你提到的手动输入是一兆字节的顺序,你要处理的是几十兆字节……但你有没有尝试过一项研究,看看这个限制是否会影响到你?

    如果它仍然对您有影响,我的建议是采用混合方法:将您的数据集切成1 MB大小的块,然后将每个块存储为sqlite表的字段(作为二进制blob)。为要索引(或搜索依据)的元素向表中添加其他字段。

    是的,它增加了复杂性,但似乎没有什么能让你接近你需要去的地方。

        7
  •  0
  •   Community CDub    7 年前

    你看过二进制序列化吗?

    看我的帖子 here 更多信息。它有示例代码来序列化dictionary对象中包含的自定义类。不知道你的结构有多复杂,但它应该很直接地适应你的需要。

    如果需要更多帮助,请添加注释…