有没有正确的方法来管理文件中的数据删除?

时间:2016-11-15 08:54:45

标签: java c# database performance

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

目前,我写入HD上文件的结构如下:

Header(uniqueID,lengthOfDataInBytes,HeaderChecksum)
data

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

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

这非常有效,因为通常的文件大小是〜2Gbyte,更新的结构是最有可能再次更新的候选者,因此在文件一开始就不太可能对结构进行持续更新。

但是,我不准备用户的文件大于RAM的情况,我想这种情况会破坏我目前更新/删除部件的设置?

是否应该如何解决这个问题的常见做法? 我想到的替代方案是:

  • 使用'跳过此扇区命令覆盖更新/删除的结构的标头,将其作为垃圾码保存在文件中,并将更新后的版本附加到最后。 好处是我不必阅读以下所有部门。缺点是,我必须决定运行清理程序的好时机。

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

这是如何处理的?对那个问题有没有更好的解决方案?

编辑:请停止建议使用sql。 我尝试过它,它的性能远远超过我目前工作的解决方案。 如果这很难相信,请考虑一下:

  • 我的双方都没有冗余内存缓冲区。
  • 我持有我的缓冲数据的引用。
  • 我不需要在查询字符串上浪费额外的周期。
  • 我已经可以对已经读取/即将写入的数据进行一些去/序列化工作来填补HD读/写时间的延迟,并且不必等待数据库返回我的queryresult /必须在我将它传递给sql之前做所有这些。(这是迄今为止最大的影响)

1 个答案:

答案 0 :(得分:2)

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

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

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

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