Я пишу модуль нативного узла для внутрипроцессной базы данных, которая обеспечивает поиск данных с нулевым копированием. Я хотел бы, чтобы мой модуль также имел эту способность. Другими словами, когда я получаю данные из базы данных, я хотел бы передать данные в V8 без необходимости копировать память или анализировать что-то.
Как я могу это сделать?
До сих пор все способы, которые я видел, включали в себя либо разбор между JSON и обратно (в данном случае это большая трата ресурсов), либо создание структур данных V8 и копирование в них данных.
ПРИМЕЧАНИЕ: если вам интересно, поиск данных с нулевым копированием означает (в двух словах), что ядру базы данных не нужно копировать память при получении данных.
Я думаю, что нашел решение, хотя оно довольно ограничено.
Интересную документацию можно найти здесь: 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
Используя вышеупомянутые два класса, можно реализовать нулевое копирование в модуле нативного узла для строк и байтовых массивов. К сожалению, кажется (в то время, когда я пишу это), это невозможно для объектов.
РЕДАКТИРОВАТЬ
В случае, если у вас все в порядке с наличием возможности нулевого копирования для string
или же Buffer
свойства объекта (но не самого объекта), его можно легко реализовать с помощью перехватчиков или средств доступа в API V8.
Других решений пока нет …