如何在内存中存储一​​个2 – 3 GB的树并使其可以访问nodejs?

我有一个大的数据树,我希望能够有效地访问叶,并有效地将大块(一次10 – 20MB)序列化成json。

现在我把它存储为JavaScript对象,但我看到垃圾收集时间为4 – 5秒,这是不好的。

我尝试使用embedded式数据库(sqlite和lmdb),但是当我访问数据的时候,从行到树的性能开销是高的 – 我需要6秒来将5MB序列化到json中。

理想情况下,我希望能够告诉v8“请不要尝试垃圾收集那棵树!” (我试图在整个过程中closuresGC,但是我在它前面运行了一个轻量级的tcp服务器,并且很快就开始耗尽内存)。

或者,也许有一个embedded的(或不embedded的?)数据库,我不知道处理这个本地。 (我知道MongoDB – 尽pipe它的最大对象大小有16 MB限制)。

我想也许试图打包节点缓冲区对象的树(即,基本上模拟v8堆栈本人),但在我得到那个绝望之前,我想我会问stackoverflow 🙂

用GC语言存储大型对象是一种不好的做法。 这在Java世界也是一个问题。 有两个解决scheme:

  • 使用内存数据库 – 就像Redis一样。 看看您是否可以利用Redis为您提供的数据结构原语。
  • Go Native – NodeJS提供了简单的(相对)FFI,因为它的一半是写入的。 请参阅附件文档,了解如何继续。

如果您正在服务器上部署,那么您也有第三个选项。 你可以把它作为一个服务来写,而不是直接把本地代码链接到Node上,然后使用像Beanstalk / ZeroMQ / RabbitMQ这样的Message Broker把它们连接在一起。

这使得易于部署,因为可以为应用程序提供合适的服务器资源。 在你的情况下,前端TCP服务器可以坐在自己的廉价的实例,而树的争夺scheme可以有一个大的内存实例工作。

而且,MongoDB对于关系数据来说也很糟糕,这使得它成为存储树的一个不好的select。 图表数据库可能会为你工作取决于你的用例。

也许你可以看看graphics数据库 ? Neo4j最近似乎很stream行,它们有node.js客户端库。