6

我是 NoSQL 的新手,我正在为我正在尝试构建的应用程序找出最合适的 NoSQL 实现而摸不着头脑。

我的 Java 应用程序需要一个包含数百万到数十亿个条目的内存哈希图,因为它对单层神经网络进行建模。现在我们正在使用Trove,以便能够使用原语作为键和值来减小映射的大小并提高访问速度。该映射是映射的映射,其中外部映射的键是长整数,而内部映射具有长/浮点键/值。

当应用程序启动时,我们需要能够将保存的状态从磁盘读取到地图地图中。对地图地图的更改也需要连续或根据某个预定间隔保存到磁盘。

起初我被OrientDB所吸引是因为他们的文档和对象数据库,尽管我现在还不确定什么会更好。然后我遇到了Redis,它是一个键值存储,与可以转储到磁盘的内存数据集一起使用,包括主从复制。但是,地图的值看起来不能是字符串以外的任何值。

我是否在正确的地方寻找满足我需求的解决方案?现在,我喜欢 Redis 的内存和主从方面,但我喜欢 OrientDB 的对象/文档功能,因为我的数据结构比简单的字符串更复杂,并且能够将 Trove 与原始键/值类型一起使用非常有利。如果阅读便宜而写作昂贵而不是相反,那就更好了。

想法?

4

5 回答 5

4

为什么不直接将 Trove 数据结构序列化到磁盘呢?从文档( http://trove4j.sourceforge.net/javadocs/serialized-form.html )来看,似乎有某种支持,但很难说,因为它都是自动生成的,而不是亲切地-制作教程。尽管如此,对于您的用例来说,为什么需要一个合适的数据库并不明显,所以也许 KISS 适用。

于 2013-02-20T14:13:21.850 回答
2

OrientDB拥有最灵活的引擎,具有 JSON 格式的索引、图形、事务和复杂文档。为什么不?

于 2013-02-20T18:35:28.447 回答
2

查看Java-Chronicle。这是一个低延迟的持久性库。我想您可能会发现它为此类数据提供了出色的性能。

于 2013-02-21T11:59:03.150 回答
1

如果您想为此使用 Redis,您可能最适合使用 ZSET 或 HASH 作为底层结构(Redis 支持结构,而不仅仅是字符串值)。除非您需要根据值/值的排序顺序来获取您的地图部分,否则 HASH 可能是最好的(就内存和速度而言)。

所以你可能想要使用 long -> {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

于 2013-02-20T19:20:52.357 回答
1

Redis 支持比简单字符串更复杂的数据结构,例如列表、(排序的)集合或散列,这对于您的域模型可能会派上用场。另一方面,您的神经网络可以利用 OrientDB 丰富的图形功能,具体取决于其结构。

于 2013-02-25T08:07:58.707 回答