我有一个小型自定义数据库,我很好奇我是否应该以不同方式处理数据更新的方式:
目前,我写入HD上文件的结构如下:
Header(uniqueID,lengthOfDataInBytes,HeaderChecksum)
data
在文件中有数千个这样的结构,数据部分平均为几百kb。
如果我想更新/删除一个结构,我将所有以下结构读入内存,将它们写回我要更新/删除的结构的开头的文件,清除我的索引器字典,然后追加更新结构到文件的末尾/什么都不做,让我的索引器再次遍历整个文件。
这非常有效,因为通常的文件大小是〜2Gbyte,更新的结构是最有可能再次更新的候选者,因此在文件一开始就不太可能对结构进行持续更新。
但是,我不准备用户的文件大于RAM的情况,我想这种情况会破坏我目前更新/删除部件的设置?
是否应该如何解决这个问题的常见做法? 我想到的替代方案是:
使用'跳过此扇区命令覆盖更新/删除的结构的标头,将其作为垃圾码保存在文件中,并将更新后的版本附加到最后。 好处是我不必阅读以下所有部门。缺点是,我必须决定运行清理程序的好时机。
将数据库拆分为多个固定大小的文件,并为索引器添加所需扇区的文件指针。保持我原来的更新/删除方式。 Updside:不需要进一步的清理工作 下行:增加了另一个抽象层次
这是如何处理的?对那个问题有没有更好的解决方案?
编辑:请停止建议使用sql。 我尝试过它,它的性能远远超过我目前工作的解决方案。 如果这很难相信,请考虑一下:
答案 0 :(得分:2)
考虑使用SQLite等实际数据库替换自定义文件格式。 (或者甚至可能是客户端/服务器数据库,例如MySQL或SQL Server。)
以额外的实施工作为代价,您将获得以下好处:
在您的情况下,uniqueID将成为表的主键,您可以删除数据列的校验和和长度,并使数据列成为blob或文本(取决于内容)。