2011-09-26 65 views
0

我很喜欢使用DB4O来存储学习算法的训练数据。这将包括(潜在地)数以亿计的对象。根据我的基准测试,每个对象平均大小为2K。检索大量对象的DB4O性能

训练算法需要重复遍历整个对象集(可能是10次)。它不关心对象在什么顺序。

我的问题是这样的:当我从DB4O中检索一大组对象时,它们是全部加载到内存中的,还是根据需要从磁盘中取出?显然,将数亿个2k对象拉到内存中对于我正在使用的服务器类型(它们大约有19GB内存)是不实用的。

Db4o是一个明智的选择吗?

+0

有两件事情 - 1.每个对象是否都是真正的2k,或者是否有自然的机会来规范化数据?请记住,DB4O是一个对象数据库,因此可以利用丰富的对象模型。 2我会做一个关于内存中保留内容的实验。我知道默认情况下,它将对象保存在内存中,但我不知道它是否会将其修剪到对象的外壳,如果它未修改并且需要更多内存。 –

回答

0

db4o activation机制允许您控制将哪个对象加载到内存中。对于复杂的对象图,您可能需要我们transparent activation,其中db4o在使用该对象时立即将对象加载到内存中。 但是db4o没有显式地从内存中删除对象。它只是对所有加载的对象保留一个弱引用。如果一个对象是可到达的,它将停留在那里(就像任何其他对象一样)。或者,您可以明确禁用对象。

我只是想给db4o的可伸缩性添加一些注释。 db4o是为嵌入应用程序和设备而构建的。它从未为大数据集构建。因此它有其局限性。

  • 它是内部单线程的。大多数db4o操作会阻止所有其他db4o操作。
  • 它只能处理相对较小的数据库。默认情况下,数据库只能是2GB。您可以increase it up to 127 GB。不过我认为db4o在2-16 GB的范围内运行良好。之后数据库可能会很大。无论如何,数以亿计的2K对象是大数据库的途径。 (100Mio 2K的obj => 200GB)

因此,你可能需要看大的对象数据库,像VOD。或者像Neo4J这样的图形数据库对您的问题也是一个很好的选择?