我是NoSQL的新手,我正在试图为我正在尝试构建的应用程序找出最合适的NoSQL实现。
我的Java应用程序需要有一个内存中的hashmap,它包含数百万到数十亿的条目,因为它模拟了单层神经网络。现在我们正在使用Trove,以便能够使用基元作为键和值来减小地图的大小并提高访问速度。地图是地图的地图,其中外部地图的键是长的,内部地图具有长/浮动键/值。
我们需要能够在应用程序启动时从磁盘读取保存的状态到地图的映射。地图地图的更改也需要连续或根据某个预定的时间间隔保存到磁盘。
由于他们的文档和对象数据库,我最初被引向OrientDB,尽管我现在仍然不确定什么会更好。然后我遇到了Redis,它是一个键值存储,可以使用可以转储到磁盘的内存数据集,包括主从复制。但是,看起来地图的值可能不是字符串。
我是否正在寻找合适的地方来解决我的需求?现在,我喜欢Redis的内存和主从方面,但我喜欢OrientDB的对象/文档功能,因为我的数据结构比简单的字符串更复杂,并且能够使用原始键/值类型的Trove非常有利。如果阅读价格便宜并且写作费用昂贵而不是反过来会更好。
思想?
答案 0 :(得分:4)
为什么不直接将Trove数据结构序列化到磁盘?从文档(http://trove4j.sourceforge.net/javadocs/serialized-form.html)来看似乎有某种支持,但很难说,因为它是所有自动生成的残骸,而不是精心制作的教程。但是,对于你的用例,你需要一个合适的数据库并不明显,所以也许KISS适用。
答案 1 :(得分:2)
OrientDB拥有最灵活的引擎,包括索引,图形,事务和复杂文档,如JSON。为什么不呢?
答案 2 :(得分:2)
结帐Java-Chronicle。这是一个低延迟的持久性库。我想你可能会发现它为这类数据提供了出色的性能。
答案 3 :(得分:1)
如果你想使用Redis,你可能最适合使用ZSET或HASH作为底层结构(Redis支持结构,而不仅仅是字符串值)。除非您需要根据值的值/排序顺序获取地图的各个部分,否则HASH可能是最好的(就内存和速度而言)。
所以你可能想要使用长 - > {long:float,...}。也就是说,longs映射到long / float贴图。然后,您可以使用HGET获取地图中的单个条目,使用HMGET获取多个条目,或使用HGETALL获取完整的地图。您可以看到命令参考http://redis.io/commands
在节省空间方面,根据HASH的预期大小,您可以调整它们以减少占用空间,同时对性能产生有限/无负面影响。
在持久性方面,您可以使用快照运行Redis,也可以使用仅附加文件进行增量保存。您可以在此处查看持久性文档:http://redis.io/topics/persistence
如果您想提出更尖锐的问题,请转到邮件列表https://groups.google.com/forum/?fromgroups=#!topic/redis-db/33ZYReULius
答案 4 :(得分:1)
Redis支持比简单字符串更复杂的data structures,例如列表,(已排序)集或哈希,这些字符串可能对您的域模型很有用。另一方面,您的神经网络可以利用OrientDB的丰富图形功能,具体取决于它的结构。