使用有效的更新/追加操作存储大量对象的最佳方法

时间:2018-01-19 10:19:53

标签: java database nosql zip storage

我的具体用例是什么?

我有一组代表e的对象。 G。配置文件。可以修改(更新),删除或添加对象。每个对象都有几个属性,但单个属性值的修改只是将整个对象标记为" modified" (所以从持久层的角度来看,一个对象是原子的)。对象之间没有关系。

此类设置的大小介于 10 - 50000 之间(但理论上没有限制 - 用户可以附加其他对象)。单个对象大小高达500KB (但通常会更小,大约 60KB )。

应尽快读取和更新对象。还有一个关键要求:它们应该保存在硬盘上,可以复制或移动它们。我的应用程序是用Java编写的,可以在Windows 7-10操作系统上运行。

我最初的做法是什么?

我得出结论,每个对象都可以很容易地表示为单个JSON文件。问题在于将大量文件保存在磁盘上。 Windows文件系统似乎不擅长处理太多(甚至很小的)文件。

然后我认为我的文件可以存储在虚拟文件系统中。第一个明显的解决方案是以这种方式将它们打包成 ZIP存档

profiles.zip:
--- profile1.json
--- profile2.json
...
--- profile10000.json

在便携性方面它将是一个很好的解决方案,读取性能也可以。但是,似乎新的对象无法复制到ZIP存档中,而无需复制存档中存储的所有文件......或者至少我没有找到办法。

那我该怎么做......?

我已经搜索了其他解决方案。我考虑使用:

  • 快速关系型数据库 - 但我觉得用大锤敲打坚果就好了。特别是我不需要处理关系或交易(我甚至不需要服务器,只有一个本地用户)。
  • NoSQL对象数据库,例如 MapDb 亚硝酸盐 - 听起来不错,但我无法找到任何可靠的比较或受欢迎程度。选择一个可靠的解决方案对我来说很重要。
  • 可以用Java管理的其他一些虚拟文件系统?也许我错过了什么?

您能根据经验提出任何想法或建议吗?我需要可移植性 大型数据集中的快速读取/更新 整个对象(可以在 Java 和 Windows OS)。

1 个答案:

答案 0 :(得分:0)

除非我们知道内存中每个对象的大小,否则很难回答这个问题。我可以提出的一个建议是尝试混合框架,它支持内存访问以及磁盘持久性。

Ehcache是​​我认为适合您的框架之一,它可以轻松支持内存中的50000个对象。甚至Couchbase也支持类似的选项以及即时或最终持久性的灵活性。