HarmonyOS鸿蒙Next中arkts与napi共享内存
HarmonyOS鸿蒙Next中arkts与napi共享内存 目前开发遇到一个问题,在设备里存储了一些生物信息,形成了大数据数组,几百M甚至上G,由于arkts和napi层参数是复制传输,造成对内存的需求翻倍,这里想求助一下大神,有没有什么好的方法能直接把arkts层的内存传给napi层,今天尝试了一下SharedArrayBuffer不行,napi层没有获取SharedArrayBuffer的接口,既不是数组也不是buffer,还有没有其它方法能不复制内存传递数据的,请大神指教
我实测了一下,应该是 buffer 模块导致的。直接用 arraybuffer 试下能不能做。buffer.buffer 目前的实现是 每次取 arraybuffer 的时候会创建一个新的对象,从而导致内存上涨。同时这也会带来另一个问题:修改的数据 获取的 arraybuffer 不同步。
更多关于HarmonyOS鸿蒙Next中arkts与napi共享内存的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
buffer/string 理论上是 zero copy 的,但是目前 鸿蒙的 buffer 是基于 ArrayBuffer 的,不确定是否也是 zerocopy的 这个问题最近在确认中。
string肯定不行,16进制数据,ArrayBuffer肯定是复制传输,内存使用量翻倍是肯定的,
“肯定” 是指有相关的文档或者官方回复明确说明吗,
实测的,监控内存,用ArrayBuffer内存使用率从19%上升到34%,
在HarmonyOS鸿蒙Next中,arkts与napi共享内存的实现主要依赖于鸿蒙系统的底层内存管理机制。arkts是鸿蒙系统的一种轻量级任务调度框架,而napi是Node.js的C/C++扩展接口。两者共享内存的需求通常出现在需要高效数据传输的场景中。
鸿蒙系统提供了共享内存的机制,可以通过SharedMemory
类来实现。SharedMemory
类允许不同进程或线程之间共享内存区域,从而实现高效的数据交换。在arkts和napi之间共享内存时,可以通过以下步骤实现:
- 创建共享内存区域:使用
SharedMemory
类的create
方法创建一个共享内存区域,并指定内存大小。 - 映射共享内存:在arkts和napi中分别调用
map
方法,将共享内存映射到各自的地址空间中。 - 数据读写:在arkts和napi中通过指针或数组的方式访问共享内存,进行数据读写操作。
- 同步机制:为确保数据一致性,可以使用鸿蒙系统提供的同步机制,如
Mutex
或Semaphore
,来协调arkts和napi对共享内存的访问。
通过这种方式,arkts和napi可以在鸿蒙系统中高效地共享内存,减少数据拷贝开销,提升系统性能。
在HarmonyOS鸿蒙Next中,ArkTS(基于TypeScript的ArkUI框架)与NAPI(Native API)可以通过共享内存实现高效数据交互。ArkTS通过@ohos.napi
模块调用NAPI接口,创建或访问共享内存区域。开发者可使用napi_create_arraybuffer
或napi_create_typedarray
在NAPI层分配内存,并将其传递给ArkTS层,实现双向数据共享。这种方式避免了频繁的数据拷贝,提升了性能,适用于大数据量或实时性要求高的场景。