我有一棵巨大的数据树,我希望能够有效地访问树叶,并高效地将大块(每次10- 20 MBs )序列化为json。
现在,我将其存储为javascript对象,但我看到垃圾收集时间为4-5秒,这是不好的。
我尝试使用嵌入式数据库( sqlite和lmdb),但是当我访问数据时,从行到树的性能开销很高--我需要6秒才能将5 MBs序列化为json。
理想情况下,我希望能够告诉v8“请不要试图垃圾收集那棵树!”(我试着在整个过程中关闭GC,但我在前面运行了一个轻量级tcp服务器,它很快就开始耗尽内存)。
或者,也许有嵌入(或者没有嵌入?)以我不知道的方式处理这个问题的数据库。(我确实知道MongoDB -它对最大对象大小有16 MB的限制)。
我正在考虑也许尝试将树打包到一个节点缓冲区对象中(基本上是自己模拟v8堆栈),但在我绝望之前,我想我会问stackoverflow :-)
发布于 2015-11-08 19:12:20
在GC语言中存储大型对象是一种糟糕的做法。这也是Java世界中的一个问题。有两种解决办法:
如果您正在服务器上部署,那么您还有第三个选项。与直接将本机代码链接到Node不同,您可以将其编写为一个服务,并使用像Bean秸秆/ ZeroMQ / RabbitMQ这样的消息代理将其绑定在一起。
这样可以方便部署,因为可以为应用程序提供合适的服务器资源。在您的示例中,前端TCP服务器可以位于它自己的廉价实例上,而Tree争用程序可以使用一个大型内存实例。
而且,对于关系数据来说,MongoDB是可怕的,这使它成为存储树的糟糕选择。图形数据库可能会根据您的使用情况而工作。
发布于 2015-11-07 17:52:59
也许您可以查看一下图形数据库?Neo4j现在似乎很受欢迎,而且它们有node.js客户端库。
https://stackoverflow.com/questions/33585498
复制相似问题