【问题标题】:Best practices for custom file structures自定义文件结构的最佳实践
【发布时间】:2009-03-01 22:49:21
【问题描述】:

我目前对其他程序员如何将数据组织到文件中非常好奇。 谁能推荐任何关于创建文件结构的最佳实践的好文章或书籍?

例如,如果您出于任何目的创建了自己的软件,您是否将保存的数据保留为纯文本、序列化、编码为 xml,为什么要这样做?

有什么我遗漏的秘密吗?

【问题讨论】:

    标签: file


    【解决方案1】:

    通常,至少在开始时,选择最简单的可行方法。考虑一下,例如 UNIX,其中大多数配置文件只不过是空格分隔的字段,或由另一个字符分隔的字段(例如 /etc/passwd,它使用“:”分隔符,因为 GCOS 字段可以包含空格。)

    如果您的数据需要更多结构,那么问问自己“我可以轻松使用哪些工具?”例如,Python 和 Ruby 有 JSON 和 YAML。

    如果您已经拥有大量基于 XML 的内容,或者您​​希望将 XML 转换为可在浏览器中显示的表单,那么 XML 基本上是有用的。否则,对于您从中获得的东西来说,它通常是非常重量级的(代码大小、复杂性)。

    【讨论】:

    • 我同意。我还说,想想未来可能对您的数据结构产生什么影响。确保您的文件格式可以轻松扩展,例如,在您的数据中添加了一个新字段。
    【解决方案2】:

    无论您选择哪种格式,请记住在其中存储某种版本号(我很确定您必须进行一些更改)。

    格式很大程度上取决于应用程序和数据量。对于某些应用程序,XML 是合适的,对于其他应用程序,存储在二进制文件中的固定大小的结构是好的。

    我根据情况使用许多不同的格式,例如:

    • 纯文本文件(分隔),用于存储用于 Matlab 和 R 分析的数据集
    • 二进制文件 - 用于存储固定大小的结构(在动态大小的情况下,如果不为元素维护单独的偏移数组,随机访问会变得很困难)。您获得了性能和空间效率的优点之一(为什么大多数数据库都以二进制格式存储数据?),但它对人类来说并不是很好。记住字节序。
    • XML - 通常用于配置数据,或我想提供给其他用户应用程序的数据(连同 XSD)。对方可以编写漂亮的 XSLT 转换或以其他方式使用数据(当然,他们可以对纯文本或二进制数据执行相同的操作)

    【讨论】:

      【解决方案3】:

      除非您有独特的要求,否则请使用已经有成熟库的东西,这样您就可以避免编写自己的解析代码。就像人们所说的那样,这意味着 XML/JSON 等。

      另一个不错的是 Google 的协议缓冲区 (http://code.google.com/p/protobuf)。在那里您编写一个通用消息定义,并且协议缓冲区编译器为您生成用于填充、序列化和反序列化数据的对象。通常格式是二进制的,但您也可以使用他们的 TextFormat 类来编写类似 JSON 的纯文本。 protobufs 的好处是可以为您生成版本控制代码。在您的文件格式的版本 2 中,您所要做的就是将字段添加到 .proto 定义文件。新版本可以读取旧文件格式,只是将新字段留空。这并不是 protobufs 的设计目的,但它们为自定义消息提供了一种简单、高效的二进制文件格式,并且为您生成了代码。

      另请参阅 Facebook 的 Thrift,现在在 Apache 孵化器中。

      【讨论】:

        【解决方案4】:

        随着岁月的流逝,我发现自己越来越喜欢文字,除非它根本不可能。 CPU 的速度已经足够快,我们可以足够快地对其进行解码。

        显然,当您必须经常更新大文件中的小信息时,这不是一种选择——但它很可能描述了一个数据库。

        此时需要一个不寻常的情况才能让我选择这两个选项之一以外的其他选项。

        【讨论】:

          【解决方案5】:

          +1 表示 XML。有一点开销,但易于解析、读取和调试。如果您使用的是模式,可以是严格的。易于使用 XSLT 进行转换,并且非常便携(有线或仅在 pendrive 中:)

          【讨论】:

            【解决方案6】:

            这实际上取决于特定情况。您需要根据各种问题的答案来考虑您的选择:

            • 您需要存储多少数据?您是否需要针对紧凑表示进行优化?
            • 读/写性能是否重要?您是否需要针对磁盘访问和低影响的序列化和反序列化进行优化?
            • 您需要对文件进行随机访问吗?您是否需要优化结构以在数据中搜索?
            • 此数据是否将用于不同的系统,可能具有不同的字符编码?您是否需要针对可移植性进行优化?

            数据本身的性质会产生影响。它是平面列表结构吗?它是一棵树吗?是循环图吗?记录是固定宽度还是可变宽度?

            一旦知道了这些问题的答案,您就可以在选项中进行选择,并尽可能保持简单。通常流行的选项(XML、CSV、YAML)会适合您的目的。如果没有,那么您将不得不开发自己的格式以及自己的写作和阅读程序。

            【讨论】:

              【解决方案7】:

              有很多可能,但最实用的还是XML

              • 几乎每个开发平台都有不错的 XML 库
              • 大多数平台都允许使用几行代码进行对象图序列化,因此 XML 实现起来很轻松
              • 大多数平台都有内存和/或流式阅读器,因此您可以处理非常大的文件而不会占用太多内存
              • 大多数平台都提供 XSLT 转换器,因此您可以将文件从一种格式移动到另一种格式,甚至从 XML 移动到非 XML
              • XML 的索引扩展也可以处理非常大的文件
              • XML 具有 XSD,可在您尝试读取之前验证格式
              • XML 能够表示任何简单或复杂的对象
              • 如果您担心文件大小,只需压缩最终的 XML。此技术用于 Microsoft Office 等
              • XML 仍然是人类可读的
              • XML 是通用标准

              【讨论】:

                猜你喜欢
                • 2012-12-15
                • 2019-01-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-05-07
                • 2014-03-20
                • 1970-01-01
                相关资源
                最近更新 更多