我正在使用Java中的大型连续数据集进行交互。理想情况下,我正在搜索一个库,在那里我可以存储流数据(想想不可变对象的序列),然后在以后跳过保存的数据。数据最终应存储在磁盘上,不应整体存储在内存中。数据将是数学系统的状态 - 因此主要是数字(双数,甚至是BigDecimals)以及一些字符串。
目前这是针对桌面应用程序的,因此一次只能有一个用户和一些并发连接(几个对象/状态流)。稍后我可以考虑在同一个数据库后端使用分布式方法并支持多个客户端。
我一直在寻找各种NoSQL库,但我不确定什么是适合我的需求。有什么想法吗?
答案 0 :(得分:2)
如果您有任何计算要访问的每个对象的偏移量的方法,那么简单的java.nio.MappedByteBuffer
- 相当于mmap - 可能会完成这项工作。
答案 1 :(得分:2)
看看OrientDB:插入速度非常快。在我的笔记本上,在6秒内插入1,000,000个条目。此外,还有Java,可以在您的流程中以嵌入的方式运行。
答案 2 :(得分:1)
如果您有64位JVM,则可以将内存映射到内存中。这将为每个文件提供最多2 GB的窗口。
当您有多个客户端时,您可以拥有一个可以访问文件或数据库的服务器进程,并将数据缓存/分发给客户端。
答案 3 :(得分:0)
只需使用二进制文件?如果您的物体尺寸相同,则很容易;你可以使用随机访问来跳转文件。您的操作系统将使用其磁盘缓存为您免费提供缓存。有时人们使用数据库和SQL接口作为golden hammer。
答案 4 :(得分:0)
你看过Berkeley DB Java Edition了吗?它是专为此类用例而设计的。大型数据集,高写入吞吐量,以及一组非常Java开发人员友好API的可靠持久性。您可以使用Base API (key/value pairs),Collections API或类似JPA的DPL (Direct Persistence Layer) API。
有一个很好的Getting Started Guide,它有示例并解释了各种API。
您的许多类似用例。实际上,Terracotta和Coherence都使用Berkeley DB来保持持久性。像Heretix,Internet Archive项目,Tibco和许多其他公司和项目一样。原因是BDB提供了所需的性能,可靠性,可扩展性,灵活性和简单性。
免责声明:我是Berkeley DB的产品经理之一,所以我很自然会有偏见。但是你的用例听起来完全符合BDB的设计目标。
祝你的项目好运。如果有任何我们可以提供的帮助,请告诉我们。您可以在OTN Forums上询问有关Berkeley DB Java Edition的问题,在那里您可以找到大量活跃的Java应用程序开发人员社区。
问候,
戴夫