问题标签 [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.
java - Windows 中的 Netty 零拷贝
1)Netty的零拷贝在windows 7上能用吗?
2)有没有人有Netty的客户端服务器零拷贝使用的例子?
3)我也找到了一个使用FileChannel实现零拷贝的例子,netty实现和java.nio.channels.FileChannel实现有什么区别?
spring - Spring 零拷贝文件下载
我必须编写一个 Web 服务,该服务将被 Web 应用程序点击以下载图像。图像 URL 不直接暴露给客户端,它将由一些业务逻辑决定。我正在使用 Amazon S3 进行文件存储,那么如何使用 spring 实现零拷贝文件传输?
c# - .NET Core 中的零拷贝
我有由较小文件组成的大文件(通常为 300 MB 到 2 GB)。我想将它们解压缩到文件夹中,并且我想有效地做到这一点(零拷贝)。
我发现,.NET Framework 有TransmitFile方法
但是我的目标是 .NET Core 呢?
IHttpSendFileFeature 接口看起来很有希望,它可能在OwinFeatureCollection 类中实现,但我该如何使用它呢?
c++11 - 没有零拷贝的 FlatBuffers 有用吗?
当我们将源流(例如从 boost.asio 中的 streambuf)复制到用户空间应用程序分配的内存时,FlatBuffers 在性能和内存效率方面仍然证明是有益的吗?还是仅使用零拷贝时效果最好?
只是在使用 flatbuffers 作为协议实现 boost.asio 服务时对此感到好奇。
也欢迎任何在 flatbuffers 和 boost.asio 上下文中实现零复制的示例代码。
如果您觉得我目前对该主题本身的总体理解不正确,请通过一些相关的阅读材料或指针进行澄清。
提前致谢。
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 类,但我仍然不清楚如何.
我会很感激一些指导。谢谢
java - 如何通过 Spring-Feign 获取 InputStream?
我想通过 Spring-OpenFeign 从服务器下载文件并将其保存在本地目录中,并进行零拷贝。
天真的下载方法如下:
在这段代码中,数据流将是这样的feign Internal Stream -> Buffer -> ByteArray -> Buffer -> File
如何以更高效、更快的方式下载和保存文件?
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 视频可以显示,但没有详细信息,也没有代码示例,如何开始?
我已经阅读了所有互联网,但找不到合适的起点。有人可以给我建议吗?
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 内核的 DDR3 内存中。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()
buf
send()
MSG_ZEROCOPY
vmsplice()
send(..., MSG_ZEROCOPY)
我在这里想念什么?有没有办法使用从内核驱动程序获得的用户空间地址进行零拷贝 TCP 发送dma_mmap_coherent()
?我可以使用另一种方法吗?
更新
所以我更深入地sendmsg()
MSG_ZEROCOPY
研究了内核中的路径,最终失败的调用是get_user_pages_fast()
. 这个调用返回-EFAULT
是因为check_vma_flags()
找到了VM_PFNMAP
在vma
. remap_pfn_range()
当使用or将页面映射到用户空间时,显然会设置此标志dma_mmap_coherent()
。我的下一个方法是找到mmap
这些页面的另一种方法。
c# - 将数据从套接字直接读取到内存映射文件中
我正在尝试创建一个 .NET Core 应用程序,但在 IPC 上有点卡住了。
我有数据通过可执行文件 1 进入(比如说,来自套接字或文件,某种流接口)。现在,我希望可执行文件 2 读取这些数据。所以,我创建了一个 MMF,其中可执行文件 1 写入数据,可执行文件 2 读取数据。一切都很好。
但是,我真的很想跳过这里的“复制”步骤。如果我有通过套接字传入的消息,我需要读取消息(ergo;将其存储在某个字节数组中),然后将其复制到适当的内存映射文件中。
有没有办法让他们使用相同的内存(尤其是现在,有了新的内存、跨度等)?
这段代码似乎几乎可以工作,但并不完全:
这个问题似乎问了类似的事情,但没有答案,并且是从2013年开始的。
sockets - TCP 文件传输 - 内核复制机制
我想知道,用户和内核空间之间的复制过程的速度,以及整个 tcp 发送/接收过程中的一般速度,是否取决于文件的类型(.txt、.mp4)。我的意思不是文件大小,而是字节的“结构”或任何东西。我搜索了很长时间,但没有找到任何相关的东西。是否有我可以查找的有用短语或术语?
提前致谢!