问题标签 [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 回答
237 浏览

java - Windows 中的 Netty 零拷贝

1)Netty的零拷贝在windows 7上能用吗?

2)有没有人有Netty的客户端服务器零拷贝使用的例子?

3)我也找到了一个使用FileChannel实现零拷贝的例子,netty实现和java.nio.channels.FileChannel实现有什么区别?

0 投票
0 回答
75 浏览

spring - Spring 零拷贝文件下载

我必须编写一个 Web 服务,该服务将被 Web 应用程序点击以下载图像。图像 URL 不直接暴露给客户端,它将由一些业务逻辑决定。我正在使用 Amazon S3 进行文件存储,那么如何使用 spring 实现零拷贝文件传输?

0 投票
0 回答
558 浏览

c# - .NET Core 中的零拷贝

我有由较小文件组成的大文件(通常为 300 MB 到 2 GB)。我想将它们解压缩到文件夹中,并且我想有效地做到这一点(零拷贝)。

我发现,.NET Framework 有TransmitFile方法

但是我的目标是 .NET Core 呢?

IHttpSendFileFeature 接口看起来很有希望,它可能在OwinFeatureCollection 类中实现,但我该如何使用它呢?

0 投票
0 回答
257 浏览

c++11 - 没有零拷贝的 FlatBuffers 有用吗?

当我们将源流(例如从 boost.asio 中的 streambuf)复制到用户空间应用程序分配的内存时,FlatBuffers 在性能和内存效率方面仍然证明是有益的吗?还是仅使用零拷贝时效果最好?

只是在使用 flatbuffers 作为协议实现 boost.asio 服务时对此感到好奇。

也欢迎任何在 flatbuffers 和 boost.asio 上下文中实现零复制的示例代码。

如果您觉得我目前对该主题本身的总体理解不正确,请通过一些相关的阅读材料或指针进行澄清。

提前致谢。

0 投票
0 回答
377 浏览

java - 使用 java nio 进行远程文件传输

我正在尝试使用 JAVA NIO 将文件从主机 A 传输到客户端 B,而无需在本地下载文件,然后为客户端 B 提供下载文件的链接。

我正在运行 spark Apache 框架并使用 maven 项目。

我使用以下方法在 Spark 中映射了请求http://localhost:8080/download/hello:get("/download/:id",RequestHandler::downloadHandler);

函数内部是从以下位置下载文件的代码:“ https://download.springsource.com/release/STS/3.8.1.RELEASE/dist/e4.6/spring-tool-suite-3.8.1.发布-e4.6-linux-gtk-x86_64.tar.gz "

我使用 httpURLConnection 获取文件名和文件大小,然后进行处理以下载文件。我想要做的是,而不是使用fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE)将文件直接传输到客户端来在本地下载文件。

我做了一些研究,我认为使用 Socketchannels 是可能的,但我不明白它应该如何工作。

我还阅读了这篇文章 https://examples.javacodegeeks.com/core-java/nio/java-nio-large-file-transfer-tutorial/ 并试图了解 Reciever 类,但我仍然不清楚如何.

我会很感激一些指导。谢谢

0 投票
1 回答
4150 浏览

java - 如何通过 Spring-Feign 获取 InputStream?

我想通过 Spring-OpenFeign 从服务器下载文件并将其保存在本地目录中,并进行零拷贝。

天真的下载方法如下:

在这段代码中,数据流将是这样的feign Internal Stream -> Buffer -> ByteArray -> Buffer -> File

如何以更高效、更快的方式下载和保存文件?

0 投票
0 回答
213 浏览

textures - 如何让 gstreamer 在特定的内存地址、用户指针写入视频帧?

我想编写由 OpenGLES2 渲染视频的 gstreamer 管道。我的第一个实现是 gstreamer appsink,它使 glTexSubImage2D() 写入纹理,然后渲染。它有效,但速度极慢。OpenGLES2 glTexSubImage2D() 是一个非常慢的函数。

我知道有一个特殊的 glimagesink 用于这些目的,但它需要 Window Id 来进行渲染,这不是我想要的。

我需要 gstreamer 将视频帧推送到 OpenGLES2 纹理,然后我将使用我自己的 OpenGLES2 着色器使用我自己的变换和转换等来渲染它。

我可以为 3 个 YUV 平面创建 3 个 DMABUF 内存区域,其中映射了 Y、U 和 V 的 3 个纹理。CPU 写入 DMABUF 内存区域,数据出现在 GPU 纹理中。

所以我希望gstreamer(在硬件视频解码之后)只是将准备好的帧写入我的内存指针。但是如何做到这一点?

我可以编写自己的 gstreamer 应用程序池,它将帧复制到我的 DMABUF 指针,但这是我想避免的额外副本。

有一些关于 gstreamer 零副本的精彩演示甚至 youtube 视频可以显示,但没有详细信息,也没有代码示例,如何开始?

我已经阅读了所有互联网,但找不到合适的起点。有人可以给我建议吗?

0 投票
2 回答
1407 浏览

linux - dma_mmap_coherent() 映射内存的零拷贝用户空间 TCP 发送

我在 Cyclone V SoC 上运行 Linux 5.1,这是一个 FPGA,在一个芯片中具有两个 ARMv7 内核。我的目标是从外部接口收集大量数据,并通过 TCP 套接字将这些数据(部分)流出。这里的挑战是数据速率非常高并且可能接近饱和 GbE 接口。我有一个工作实现,它只使用write()对套接字的调用,但最高速度为 55MB/s;大约是理论 GbE 限制的一半。我现在正试图让零拷贝 TCP 传输工作以增加吞吐量,但我碰壁了。

为了将 FPGA 中的数据导入 Linux 用户空间,我编写了一个内核驱动程序。该驱动程序使用 FPGA 中的 DMA 块将大量数据从外部接口复制到连接到 ARMv7 内核的 D​​DR3 内存中。dma_alloc_coherent()当使用with进行探测时,驱动程序将此内存分配为一组连续的 1MB 缓冲区,并通过在文件中实现并将地址返回给使用预分配缓冲区的应用程序GFP_USER,将这些内存公开给用户空间应用程序。mmap()/dev/dma_mmap_coherent()

到现在为止还挺好; 用户空间应用程序正在查看有效数据,并且吞吐量在 >360MB/s 时绰绰有余,还有剩余空间(外部接口不够快,无法真正看到上限是多少)。

为了实现零拷贝 TCP 网络,我的第一种方法是SO_ZEROCOPY在套接字上使用:

但是,这会导致send: Bad address.

在谷歌搜索了一下之后,我的第二种方法是使用管道,splice()然后是vmsplice()

但是,结果是一样的:vmsplice: Bad address.

请注意,如果我替换对仅打印由(或包含)指向的数据的函数的调用vmsplice()或调用,则一切正常;因此用户空间可以访问数据,但/调用似乎无法处理它。send()bufsend() MSG_ZEROCOPYvmsplice()send(..., MSG_ZEROCOPY)

我在这里想念什么?有没有办法使用从内核驱动程序获得的用户空间地址进行零拷贝 TCP 发送dma_mmap_coherent()?我可以使用另一种方法吗?

更新

所以我更深入地sendmsg() MSG_ZEROCOPY研究了内核中的路径,最终失败的调用是get_user_pages_fast(). 这个调用返回-EFAULT是因为check_vma_flags()找到了VM_PFNMAPvma. remap_pfn_range()当使用or将页面映射到用户空间时,显然会设置此标志dma_mmap_coherent()。我的下一个方法是找到mmap这些页面的另一种方法。

0 投票
0 回答
338 浏览

c# - 将数据从套接字直接读取到内存映射文件中

我正在尝试创建一个 .NET Core 应用程序,但在 IPC 上有点卡住了。

我有数据通过可执行文件 1 进入(比如说,来自套接字或文件,某种流接口)。现在,我希望可执行文件 2 读取这些数据。所以,我创建了一个 MMF,其中可执行文件 1 写入数据,可执行文件 2 读取数据。一切都很好。

但是,我真的很想跳过这里的“复制”步骤。如果我有通过套接字传入的消息,我需要读取消息(ergo;将其存储在某个字节数组中),然后将其复制到适当的内存映射文件中。

有没有办法让他们使用相同的内存(尤其是现在,有了新的内存、跨度等)?

这段代码似乎几乎可以工作,但并不完全:

这个问题似乎问了类似的事情,但没有答案,并且是从2013年开始的。

0 投票
1 回答
27 浏览

sockets - TCP 文件传输 - 内核复制机制

我想知道,用户和内核空间之间的复制过程的速度,以及整个 tcp 发送/接收过程中的一般速度,是否取决于文件的类型(.txt、.mp4)。我的意思不是文件大小,而是字节的“结构”或任何东西。我搜索了很长时间,但没有找到任何相关的东西。是否有我可以查找的有用短语或术语?

提前致谢!