我有一个庞大的数据树,我希望能够有效地访问叶子,并有效地将大块(一次10-20 MB)串行化为json.
现在我将它存储为javascript对象,但我看到垃圾收集时间为4 – 5秒,这是不对的.
我尝试使用嵌入式数据库(sqlite和lmdb),但是当我访问数据时从行到树的性能开销很高 – 我花了6秒钟将5 MB串行化为json.
理想情况下,我希望能够告诉v8“请不要尝试垃圾收集那棵树!” (我尝试在整个过程中关闭GC,但我在它前面运行一个轻量级tcp服务器,并且很快就开始耗尽内存).
或者,也许有一个嵌入式(或非嵌入式?)数据库本地处理这个我不知道的数据库. (我确实知道MongoDB – 它对最大对象大小有16 MB的限制).
我正在考虑尝试将树打包在节点缓冲区对象中(即,基本上模拟v8堆栈)但在我绝望之前我想我会问stackoverflow 🙂
最佳答案 使用GC语言存储大型对象是一种不好的做法.这也是 Java世界的一个问题.
有两个解决方案:
>使用内存数据库 – 如Redis.看看您是否可以利用Redis为您提供的数据结构原语.
> Go Native – NodeJS提供简单(相对)FFI,因为一半的库都写在其中.有关如何继续,请参阅插件文档here.
如果要在服务器上部署,那么您也有第3个选项.您可以将其作为服务编写,并使用像Beanstalk / ZeroMQ / RabbitMQ之类的Message Broker将其绑定在一起,而不是将本机代码直接与Node链接.
这样可以轻松部署,因为可以为应用程序配置合适的服务器资源.在您的情况下,前端TCP服务器可以位于自己的廉价实例上,而Tree争论程序可以使用大型内存实例.
此外,MongoDB对于关系数据来说非常糟糕,这使得它成为存储树的糟糕选择.图形数据库可能适合您,具体取决于您的用例.