如何在本机节点模块中维护零拷贝?

时间:2013-05-10 07:40:55

标签: c++ node.js v8 node-modules

我正在为进程内数据库编写一个本机节点模块,该数据库具有零拷贝数据查找功能。我希望我的模块也具备这种能力。换句话说,当我从数据库中获取数据时,我想将数据传递给V8,而无需复制内存或需要解析内容。

我该怎么做?

到目前为止,我所看到的所有方法都涉及在JSON之间来回解析(在这种情况下几乎浪费资源)或实例化V8数据结构并将数据复制到其中。

注意:如果您想知道,零拷贝数据查找意味着(简而言之)数据库引擎在检索数据时不需要复制内存。

1 个答案:

答案 0 :(得分:3)

我认为我找到了解决方案,尽管它相当有限。

有趣的文档可以在这里找到:https://developers.google.com/v8/(概述)和http://izs.me/v8-docs/main.html(API文档)

似乎V8有一个ExternalStringResource类可以用于此目的:
http://izs.me/v8-docs/classv8_1_1String_1_1ExternalStringResource.html

节点本身也有一个Buffer类,它也可用于类似的目的:
http://nodejs.org/api/buffer.html

通过使用上述两个类,可以在本机节点模块中为字符串和字节数组实现零拷贝。不幸的是,似乎(在我写这篇文章的时候)对象是不可能的。

修改

如果您只对对象的stringBuffer属性具有零复制能力(但不是整个对象本身),则可以使用拦截器轻松实现或V8 API中的访问者。