可能重复:
设计(二进制)文件格式时有哪些重点?
我将开发一个将数据存储在文件中的程序。
文件可能很大。文件中的数据基本上是由变长记录组成的。我需要随机访问记录。
我只想阅读一些有关如何设计数据文件结构的资源/书籍。但我还找不到。
任何建议都非常感谢。
可能重复:
设计(二进制)文件格式时有哪些重点?
我将开发一个将数据存储在文件中的程序。
文件可能很大。文件中的数据基本上是由变长记录组成的。我需要随机访问记录。
我只想阅读一些有关如何设计数据文件结构的资源/书籍。但我还找不到。
任何建议都非常感谢。
您可能会发现http://decoy.iki.fi/texts/filefd/filefd很有用。这是要考虑的技术的一般起点。
还要在 SO 上查看这个问题:设计(二进制)文件格式时有哪些重点?
您描述的问题是数据库理论的中心主题。
关于这个主题的任何体面的文字都应该给你一些好主意。uni 的标准文本是:
数据库系统基础 - Elmasari 和 Nava (PDF) (Amazon)
另一种方法是使用结构的内存映射数组,看看我对类似问题的丰富回答
另一种方法是使用像Google protobuf这样的二进制协议,并在写入时将数据“发送”到文件,并在写入时“接收”它。
如果您正在寻找的答案是“读什么书”,我无能为力。
如果“如何做到这一点”对你也有好处,我有一些建议。
Srykar 提出的一种很好的解决方案。我只想补充一点,我会使用 SQLite 而不是 MySQL。它是一个可以嵌入到程序中的开源 C 库。它允许您将数据存储在数据库中,就像您使用 SQL 语句一样,而是调用库 C 函数。在您的情况下,您可以将所有内容保存在内存中,然后在适当的时候将数据保存到磁盘。
另一种选择是旧的“自己动手”。我的意思是:将数据存储到文件中没有什么复杂的(除非您的数据非常结构化,但在这种情况下我会选择 nr. 1 选项)。
您写下您希望文件结构如何的计划。在将文件写入磁盘和读取文件将数据重新存储到内存时,您都遵循该计划。
如果你有n条记录。将n写入磁盘,然后写入每条记录。
如果每条记录都有可变长度,则在写入记录之前写入每条记录的长度。
您在问题中谈论“随机访问”。可能您的意思是该文件非常大,并且在访问时您只想从磁盘读取您感兴趣的部分。
如果是这样,计划建立一个索引;该索引将告诉文件开头的每个元素的偏移量(以字节为单位)。将索引存储在文件的开头,然后存储数据。
当您读取文件时,您开始读取索引,获取所需数据的偏移量,然后读取文件的该部分。
这些是非常基本的例子,只是为了理解......
希望他们有所帮助!
您是否有任何理由不考虑将这些数据放在像 mysql 这样的持久数据库存储中?这些系统旨在处理具有适当索引的随机数据访问,以加快您的数据检索。另外,在读取文件时,您必须读取整个文件才能获得所需的内容,因为没有索引和查询语言。
除此之外,他们还拥有适当的系统,以确保多个正在运行的进程可以访问相同的数据而不会损坏数据。它提供了数据不一致的情况下的恢复。
所以只是存储是简单的部分,它并没有就此结束。您最终必须提供所有其他解决方案。更好地使用可用的东西。