使用Java,如何在文件中存储大约10亿个键值对,并且可以在必要时动态更新和查询值?
答案 0 :(得分:1)
如果由于某种原因数据库不可能,那么您需要回答以下关于您的问题的问题:
以下操作的组合是什么?
一旦您对这些操作的比例有了很好的猜测,请尝试选择适合您的文件的数据结构。我建议从本书开始作为一个很好的选项目录:
http://www.amazon.com/Introduction-Algorithms-Second-Thomas-Cormen/dp/0262032937
您需要为最常见的操作选择具有最佳平均和最差情况运行时的数据结构。
祝你好运
答案 1 :(得分:1)
旧问题,但这是日志文件的情况。每次执行删除操作时,您都不希望复制十亿条记录。这可以通过将所有“事务”或更新记录到新的单独文件中来解决。这些文件应分解为合理的大小。
要读取元组,请从最新的日志文件开始,直至找到密钥,然后停止。要更新或插入,只需将新记录添加到最新的日志文件中。删除仍然是一个日志条目。
需要定期运行批处理合并过程,该过程将扫描每个日志文件并写出另一个主文件。在读取时,每个NEW键都会被写入新的主键,并且会跳过重复的(旧)键,直到您完成所有操作。如果遇到删除记录,请在单独的删除列表中将其标记为跳过记录,并忽略具有该密钥的后续记录。
这听起来很简单,但是记住你可能想要阻止/分块你的文件,因为你可能会反向扫描所述日志文件,或者你至少会seek()
到最大大小并反向写入阅读。
我已经用数十亿行数据做了这件事。您只是在重新发明顺序访问数据库。
答案 2 :(得分:0)
您可以使用数据库吗?管理这么大的文件会很痛苦。
编辑:如果文件要求主要是为了避免机器通信故障,停机和类似情况,也许您可以使用嵌入式数据库。这样您就可以摆脱大型文件操作问题,并仍然可以使用数据库可以为您提供的所有优势。我已经使用Apache Derby作为嵌入式数据库,效果很好。 Java DB受Oracle支持并基于Derby。
答案 3 :(得分:0)
你遗漏了很多细节,但是......
键是静态的吗?价值观怎么样?它们是固定大小的吗?为什么不使用数据库?
如果您不想使用数据库,请使用内存映射文件。