我有一个庞大的数据树,我希望能够有效地访问叶子,并有效地将大块(一次10-20 MB)串行化为json。
现在我将它存储为javascript对象,但我发现垃圾收集时间为4 - 5秒,这是不行的。
我尝试使用嵌入式数据库(sqlite和lmdb),但是当我访问数据时从行到树的性能开销很高 - 我花了6秒钟将5 MB序列化为json。
理想情况下,我希望能够告诉v8"请不要尝试垃圾收集那棵树!" (我尝试在整个过程中关闭GC,但是我在它前面运行一个轻量级tcp服务器,并且很快就开始耗尽内存)。
或者,也许有一个嵌入式(或非嵌入式?)数据库,它本地处理这个我不了解的数据库。 (我确实知道MongoDB - 它对最大对象大小有16 MB的限制。)
我想到可能尝试将树打包在一个节点缓冲区对象中(也就是说,我自己基本上模拟了v8堆栈),但在我绝望之前,我想我会问stackoverflow: - )< / p>
答案 0 :(得分:1)
以GC语言存储大型对象是一种不好的做法。这也是Java世界的一个问题。 有两个解决方案:
如果要在服务器上部署,那么您也有第3个选项。您可以将其作为服务编写,并使用像Beanstalk / ZeroMQ / RabbitMQ之类的Message Broker将其绑定在一起,而不是将本机代码直接与Node相关联。
这样可以轻松部署,因为可以为应用程序配置合适的服务器资源。在您的情况下,前端TCP服务器可以位于自己的廉价实例上,而Tree争论程序可以使用大型内存实例。
此外,MongoDB对于关系数据来说非常糟糕,这使得它成为存储树的糟糕选择。图表数据库可能会对您有用,具体取决于您的用例。
答案 1 :(得分:0)
也许您可以查看graph databases? Neo4j这些天似乎很受欢迎,他们有node.js客户端库。