gpt4 book ai didi

java - 如何处理JavaCPP避免数据复制?

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:52 25 4
gpt4 key购买 nike

我正在使用 JavaCPP 在 Java 应用程序中利用一些 C++ 库,但操作的数据是大数据。所以我的代码工作正常,但内存不友好(我需要它快速工作):

  • 我有一个大byte[][]提供给原生部分。
  • 目标 native 函数类似于 nativeFunction(PointerPointer param) -> Doc
  • (准确地说,这是一个 PointerPointer<BytePointer> 类型,因此 BytePointer 的列表为 byte[][]byte[] 的列表) -> Doc

我这样初始化预期的参数:

byte[][] myBigDatas;
// myBigDatas.length = 4
// myBigDatas[x].length = something like 4000000

// Initialize param
PointerPointer<BytePointer> srcParam = new PointerPointer<BytePointer>(
myBigDatas[0],
myBigDatas[1],
myBigDatas[2],
myBigDatas[3]);

// Call the native function
nativeFunction(srcParam);

问题是,引用文档,对于每个 BytePointerPointerPointer<BytePointer>(...) 的调用创建对于提供的数据,它不是内存包装,而是制作的副本。

有办法避免复制吗?

编辑:

否则,JNI是否提供了give AND return的解决方案byte[][] 不复制? (我知道这是一个简单的 byte[] )

最佳答案

我找到了解决方案,只是想分享一下。我用 ByteBuffer[] (direct ByteBuffer 数组)替换了 byte[][]。然后,做

BytePointer bp = new BytePointer(/*direct ByteBuffer*/)

不复制!性能提升巨大!!

关于java - 如何处理JavaCPP避免数据复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39074575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com