6

可能重复:
设计(二进制)文件格式时有哪些重点?

我将开发一个将数据存储在文件中的程序。

文件可能很大。文件中的数据基本上是由变长记录组成的。我需要随机访问记录。

我只想阅读一些有关如何设计数据文件结构的资源/书籍。但我还找不到。

任何建议都非常感谢。

4

4 回答 4

3

您可能会发现http://decoy.iki.fi/texts/filefd/filefd很有用。这是要考虑的技术的一般起点。

还要在 SO 上查看这个问题:设计(二进制)文件格式时有哪些重点?

于 2013-01-03T08:41:10.550 回答
2

您描述的问题是数据库理论的中心主题。

关于这个主题的任何体面的文字都应该给你一些好主意。uni 的标准文本是:

数据库系统基础 - Elmasari 和 Nava (PDF) (Amazon)

另一种方法是使用结构的内存映射数组,看看我对类似问题的丰富回答

另一种方法是使用像Google protobuf这样的二进制协议,并在写入时将数据“发送”到文件,并在写入时“接收”它。

于 2013-01-03T09:02:00.680 回答
2

如果您正在寻找的答案是“读什么书”,我无能为力。

如果“如何做到这一点”对你也有好处,我有一些建议。

Srykar 提出的一种很好的解决方案。我只想补充一点,我会使用 SQLite 而不是 MySQL。它是一个可以嵌入到程序中的开源 C 库。它允许您将数据存储在数据库中,就像您使用 SQL 语句一样,而是调用库 C 函数。在您的情况下,您可以将所有内容保存在内存中,然后在适当的时候将数据保存到磁盘。

参考: http ://www.sqlite.org

另一种选择是旧的“自己动手”。我的意思是:将数据存储到文件中没有什么复杂的(除非您的数据非常结构化,但在这种情况下我会选择 nr. 1 选项)。

您写下您希望文件结构如何的计划。在将文件写入磁盘和读取文件将数据重新存储到内存时,您都遵循该计划。

如果你有n条记录。将n写入磁盘,然后写入每条记录。

如果每条记录都有可变长度,则在写入记录之前写入每条记录的长度。

您在问题中谈论“随机访问”。可能您的意思是该文件非常大,并且在访问时您只想从磁盘读取您感兴趣的部分。

如果是这样,计划建立一个索引;该索引将告诉文件开头的每个元素的偏移量(以字节为单位)。将索引存储在文件的开头,然后存储数据。

当您读取文件时,您开始读取索引,获取所需数据的偏移量,然后读取文件的该部分。

这些是非常基本的例子,只是为了理解......

希望他们有所帮助!

于 2013-01-03T09:23:24.837 回答
1

您是否有任何理由不考虑将这些数据放在像 mysql 这样的持久数据库存储中?这些系统旨在处理具有适当索引的随机数据访问,以加快您的数据检索。另外,在读取文件时,您必须读取整个文件才能获得所需的内容,因为没有索引和查询语言。

除此之外,他们还拥有适当的系统,以确保多个正在运行的进程可以访问相同的数据而不会损坏数据。它提供了数据不一致的情况下的恢复。

所以只是存储是简单的部分,它并没有就此结束。您最终必须提供所有其他解决方案。更好地使用可用的东西。

于 2013-01-03T08:36:20.900 回答