Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不复制数据的情况下将IntBuffer转换为ByteBuffer_Java_Scala_Nio_Bytebuffer_Project Panama - Fatal编程技术网

Java 如何在不复制数据的情况下将IntBuffer转换为ByteBuffer

Java 如何在不复制数据的情况下将IntBuffer转换为ByteBuffer,java,scala,nio,bytebuffer,project-panama,Java,Scala,Nio,Bytebuffer,Project Panama,我的Scala/Java代码有一个大的(几百兆字节)整数数组。我会使用java.nio从这个int[]尽可能快地发送这些文件(不复制内容)。此外,当我在niosocket通道上接收到任何数据时,我会将数据用作int[],而不进行复制 所有nio操作都需要ByteBuffer,而ByteBuffer只能包装byte[] 我可以分配一个ByteBuffer,然后使用asIntBuffer放置我的数组,但它会复制随机数组,我必须存储数据两次 val size = 1234 val r

我的Scala/Java代码有一个大的(几百兆字节)整数数组。我会使用
java.nio
从这个
int[]
尽可能快地发送这些文件(不复制内容)。此外,当我在
nio
socket通道上接收到任何数据时,我会将数据用作
int[]
,而不进行复制

所有
nio
操作都需要
ByteBuffer
,而
ByteBuffer
只能包装
byte[]

我可以分配一个
ByteBuffer
,然后使用
asIntBuffer
放置我的数组,但它会复制随机数组,我必须存储数据两次

    val size = 1234

    val random = Array.fill[Int](size) { scala.util.Random.nextInt(1000) }

    val buf = ByteBuffer.allocate(4 * size)
    buf
      .asIntBuffer()
      .put(random)
我正在使用ProjectPanamaOpenJDK,因此任何新的技巧(比如使用
指针
)都可以帮助我


TL;DR:在Java或Scala中,如何访问整数数组作为
ByteBuffer
int[]

你看过IntBuffer和ByteBuffer上的
wrap
方法了吗?ByteBuffer只能
wrap
字节数组,不能是整数。IntBuffer可以包装整数,但nio套接字通道只接受ByteBuffer,您怎么想?您需要将一个数据数组转换为另一个数据数组,您无法比O(2n)内存消耗更好地执行此操作。也许正确的思考方向是将长数组分配给一些批处理。您不必在一次写调用中发送整个int数组。分配一个大小合理的字节缓冲区(比如4兆字节),使用asIntBuffer.put填充int数组的子部分,然后一次发送一个子部分。很可能你的网络接口将成为瓶颈,而不是程序的速度。我的重点是尽可能少地使用拷贝操作。我的理想方案是在*缓冲区中使用
allocateDirect
,并在访问其内容时将其用于nio零拷贝。用例是:我正在处理一些类似MPI的消息传递接口,而我有时需要低延迟,有时需要高吞吐量。源于其他语言,
sendfile()
/zero copy是一个不错的选择。这在JVM中不一样吗?