是否有适当的方法来管理从文件中删除数据

本文关键字:文件 删除 数据 管理 方法 是否 | 更新日期: 2023-09-27 18:17:52

我有一个小的自定义数据库,我很好奇我是否应该处理我处理数据更新的方式不同:

目前我在HD上写入文件的结构是这样组成的:

Header(uniqueID,lengthOfDataInBytes,HeaderChecksum)
data

文件中有数千个这样的结构,数据部分平均有几百kb。

如果我想要更新/删除一个结构,我把下面所有的结构读入内存,把它们写回我想要更新/删除的结构的开头,清空我的索引器字典,然后把更新的结构追加到文件的末尾/什么都不做,让我的索引器再次遍历整个文件。

这工作得很好,因为通常的文件大小是~2Gbyte,并且更新的结构最有可能再次更新,因此不太可能在文件的最开始对结构进行持续更新。

然而,我没有准备一个情况下,用户的文件大小大于他的RAM,我想这种情况会打破我当前的设置更新/删除部分?

对于如何解决这个问题是否有一个共同的实践?我想到的替代方案是:

  • 用'skip this sector'命令覆盖更新/删除结构的头,将其作为垃圾代码保存在文件中,并将更新的版本附加到末尾。好处是,我不需要阅读以下所有板块。缺点是,我必须决定一个合适的时间来运行清理程序。

  • 将数据库分割成固定大小的多个文件,并为我的索引器添加所需扇区的文件指针。保持我以前的更新/删除方式。优点:不需要进一步的清理工作缺点:增加了另一个抽象层次

这通常是如何处理的?有没有更好的办法来解决这个问题?

编辑:请停止建议使用sql。我试过了,它的表现比我目前的解决方案差得多。如果你觉得难以置信,不妨考虑一下:
    我没有冗余的内存缓冲区在两边。我保存我的缓冲数据的引用。
  • 我不需要在查询字符串上浪费额外的周期。
  • 我可以填补hd读/写时间的延迟,已经在已经读/即将写的数据上做了一些反/序列化工作,而不必等待数据库返回我的查询结果/在我把它传递给sql之前必须做所有这些。(这是迄今为止影响最大的)

是否有适当的方法来管理从文件中删除数据

考虑用实际的数据库(如SQLite)替换自定义文件格式。(或者甚至是客户端/服务器数据库,如MySQL或SQL server)

以额外的实现工作为代价,您将获得以下好处:

  • 经过测试和验证的代码处理您的数据。
  • 随机访问数据(数据库为您索引记录)意味着快速插入/更新/删除。

在您的示例中,uniqueID将成为表的主键,您可以删除数据列的校验和和长度,并使数据列为blob或文本(取决于内容)。