gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:13:58 25 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




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

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

Header(uniqueID,lengthOfDataInBytes,HeaderChecksum)
data

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

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

这非常有效,因为通常的文件大小约为 2Gbyte,并且更新的结构最有可能再次更新,因此不太可能在文件的开头对结构进行持续更新。

但是,对于用户的文件大小比他的 RAM 大的情况,我没有准备好,我猜这种情况会破坏我当前的更新/删除部件设置?

是否有应该如何解决这个问题的常见做法?
我想到的替代方案是:
  • 使用“跳过此扇区”命令覆盖更新/删除结构的标题,将其作为垃圾代码保存在文件中,并将更新版本附加到末尾。
    好处是我不必阅读以下所有部门。不利的一面是,我必须决定一个运行清理例程的好时机。
  • 将数据库拆分为多个固定大小的文件,并将所需扇区的文件指针添加到我的索引器中。保持我旧的更新/删除方式。
    优点:不需要进一步的清理工作
    缺点:增加了另一个抽象级别

  • 这个一般是怎么处理的?有没有更好的解决方案来解决这个问题?

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

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

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

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

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

    关于java - 是否有适当的方法来管理从文件中删除数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605557/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com