问题标签 [zero-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
193 浏览

java - Netty 使用来自池化直接 ByteBuf 的 ByteBuffer

我试图了解有关 netty 的 ByteBuf 及其与 nio.ByteBuffer 的关系的一些事情。

我试图解决的问题是我的服务器必须返回位于服务器上的文件的随机部分——这是使用 nio.FileChannel 实现的,而 FChannel 取决于 nio.ByteBuffer。

据我了解,分配直接 ByteBuffer 应该是池化的 - 但 nio 中没有本机池实现 - 我的应用程序应该添加这样的层,所以我不会为每个请求创建直接缓冲区而付出代价。

我的应用程序使用 netty 作为服务器,所以我认为我可以使用 netty 的池化直接 ByteBuff 并访问它使用的 ByteBuffer

所以一切都按预期工作,但.nioBuffer.nioBuffers创建缓冲区的副本 - 不仅仅是 ByteBuff 上的视图,因此在写入chunkHolder位置/限制/等后byteBuf保持不变!

我必须使用

所以再次创建对象,唯一的好处是没有复制该内存-如果我没记错的话。

问题:我可以做一些更聪明的事情,以便在 tcp 传输和文件读取之间没有数据复制,并且垃圾最少?nio 是否有助于维护直接的 ByteBuffers?

我想到的最好的想法是用类似 ByteBuffer 的实现包装 BytBuf,并将所有写操作代理回底层 byteBuf。

PS:我也看过io/netty/channel/DefaultFileRegion.java它与 nio.FileChannel 一起使用,但在幕后 netty 直接使用 nio

0 投票
2 回答
349 浏览

python - Numpy数组:在不复制的情况下获取原始字节

我正在尝试将多个 Numpy 数组的字节连接成一个bytearray,以便在 HTTP 发布请求中发送它。

我能想到的最有效的方法是创建一个足够大的bytearray对象,然后将所有 numpy 数组中的字节连续写入其中。

代码将如下所示:

该方法tobytes()不是零拷贝方法。它将 numpy 数组的原始数据复制到一个bytes对象中。

在 python 中,缓冲区允许访问内部原始数据值(这在 C 级别称为协议缓冲区) Python 文档;numpy 在 numpy1.13 中有这种可能性,该方法称为getbuffer() link。然而,这种方法已被弃用!

这样做的正确方法是什么?

0 投票
0 回答
28 浏览

java - 通过 FileChannel 将 Netty ByteBuf 零复制到文件中

我想使用FileChannels#transferFrom将从 SocketChannel 接收的Netty DirectByteBuf零复制到文件中。我利用 ReadableByteChannel 接口创建了一个 ByteChannel 来读取,如下所示:

调试它表明这ByteBuffer dst是一个 HeapByteBuffer。这样零拷贝是不可能的。有没有机会在ByteBuf content不触及用户空间的情况下让我进入文件?我真的必须将 SocketChannel 直接读入文件吗?

更新

调试FileChannel使我意识到,这transferFrom仅适用于文件到文件的传输。一个简单fileChannel.write(directBuffer)的应该做零拷贝。唯一让我有点困扰的是我的 corretto java 无法加载write0. 这是否意味着性能较低或是否意味着副本不是零副本?

0 投票
2 回答
688 浏览

c++ - 有没有办法制作一个引用外部提供的缓冲区但不拥有它的 std::string ?

基本上,如果一个人有一个空终止字符串的预加载缓冲区和要引用的长度,并且想要将对它的引用传递给一个采用 std::string & 但不复制字符串或拥有它的方法,是吗有可能吗?

这只会有一个有限的生命周期,它的管理方式是它只在缓冲区有效时才有效。

0 投票
0 回答
25 浏览

java - 如何使用java实现网络零拷贝到磁盘?

我想从网络下载文件,我可以使用零拷贝的java吗?