自定义文件结构的最佳实践

时间:2009-03-01 22:49:22

标签: file

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

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

我错过了什么秘密?

7 个答案:

答案 0 :(得分:7)

一般来说,至少在开始时,尽可能使用最简单的东西。例如,考虑UNIX,其中大多数配置文件只是以空格分隔的字段,或者是用另一个字符分隔的字段(例如/ etc / passwd,它使用“:”分隔符,因为GCOS字段可以包含空格。)

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

如果您已经拥有大量基于XML的东西,那么XML基本上是有用的,或者您希望将XML转换为浏览器中的可显示形式。否则,它通常是非常重量级的(代码大小,复杂性),你可以从中得到它。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:2)

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

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

另见Facebook的Thrift,现在在Apache孵化器中。

答案 3 :(得分:1)

随着岁月的流逝,我发现自己越来越喜欢文字了,除非它完全没有问题。现在CPU足够快,我们可以足够快地解码它。

显然,当你不得不频繁更新大文件中的一小部分信息时,这不是一个选择 - 但很可能描述了一个数据库。

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

答案 4 :(得分:1)

+1的XML。有一点开销,但易于解析,读取和调试。如果您使用的是架构,则可以是严格的。使用XSLT轻松转换,非常便携(有线或只是在pendrive中:)

答案 5 :(得分:1)

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

  • 您需要存储多少数据?您是否需要针对紧凑型表示进行优化?
  • 读/写性能是否至关重要?您是否需要优化磁盘访问和低影响序列化和反序列化?
  • 您是否需要在文件中随机访问?您是否需要优化结构以在数据中寻找?
  • 这些数据是否会在不同的系统中使用,可能使用不同的字符编码?你需要优化便携性吗?

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

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

答案 6 :(得分:0)

有很多可能性,但最实用的必须是XML

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