要拼接的python接口(2)

py-splice的Python项目详细描述


连接(2)系统调用的python接口。

关于

splice(2)移动 两个文件描述符之间的数据,而不在内核之间复制 地址空间和用户地址空间。它最多传输nbytes字节 从文件描述符in到文件描述符out的数据。

零拷贝

通常,当您将数据从一个数据流复制到另一个数据流时, 要复制的内容首先存储在用户空间的缓冲区中,然后 从用户空间复制回目标数据流 引入了一定的开销。

零拷贝允许我们在不使用拷贝的情况下操作数据 数据到用户空间。它通过重新映射页面来传输数据。 不实际执行数据复制,导致 提高了性能。

下面是从一个文件复制数据的简单示例 使用splice(2)系统调用。完整的文件 见API Documentation

# copy data from one file to another using splicefromspliceimportspliceto_read=open("read.txt")to_write=open("write.txt","w+")splice(to_read.fileno(),to_write.fileno())

此数据复制两次(一次进入userland缓冲区,一次退出 从那个userland缓冲区)施加一些性能和资源惩罚。 splice(2)系统调用避免了这些 避免使用userland缓冲区的惩罚;它还导致 系统调用(因此只有一个上下文切换),而不是 read(2)/ write(2)系统调用(每个系统调用 需要一个上下文开关)在内部用于数据复制。

API文档

sendfile模块提供一个函数:sendfile()。

  • splice.splice(out, in, offset, nbytes, flags)

    nbytes字节从中的文件描述符复制到文件 描述符out(常规文件)从offset开始。返回 刚刚发送的字节数。当到达文件结尾时返回0。 如果未指定offset,则从当前 更新的位置和的位置。如果nbytes是 未指定,则将中的整个复制到中的

    必需参数

    • in:要从中读取数据的文件的文件描述符。
    • out:要将数据传输到的文件的文件描述符。

    位置可选参数

    • offset:从中读取输入文件的偏移量。

    • nbytes:总共要复制的字节数,默认值

    • flags:一个位掩码,可以通过将以下对象连接在一起组成。

      • ^{tt11}$
      • ^{tt12}$
      • ^{tt13}$
      • ^{tt14}$

    有关每个标志的含义的更多信息,请参见拼接(2) 手册页here

用法

>>>fromspliceimportsplice# init file objects>>>to_read=open("read.txt")# file to read from>>>to_write=open("write.txt","w+")# file to write to>>>len(to_read.read())50# copying whole file>>>splice(to_read.fileno(),to_write.fileno())50# bytes copied# copying file starting from an offset>>>splice(to_read.fileno(),to_write.fileno(),offset=10)40# copying certain amount of bytes>>>splice(to_read.fileno(),to_write.fileno(),nbytes=20)20# copying certain amount of bytes beginning from an offset>>>splice(to_read.fileno(),to_write.fileno(),offset=10,nbytes=20)20# specifying flags>>>importsplice>>>splice(to_read.fileno(),to_write.fileno(),flags=splice.SPLICE_F_MORE)50

我为什么要用这个?

splice(2)在性能方面应该比 因为它避免了复制 数据到用户地址空间,而是通过重新映射页进行传输 在内核地址空间中。

支持的平台

splice(2)系统调用特定于(gnu)linux。

支架

请随时添加改进,报告问题或与我联系有关的任何项目。

许可证

GNU GPL

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java InputStream对象在声明后关闭   java未定义名为“transactionManager”的bean重命名transactionManager   java“jar”命令何时会拒绝将类添加到java中。jar文件?   java JPA标准依赖WHERE子句   安卓中从SD卡读取文本文件时出现java错误   java直接启用类似位置的权限   使用@WebMvcTest和Mockito-BDDMockito对SpringBoot-RestController进行java测试   java JSESSIONID存储在哪里?   java jtextarea鼠标事件覆盖容器鼠标事件   java DRL无法解析动态加载的类   java是从一个方法返回多个对象的最简单方法   java自定义按钮/编辑框是否不可见?   java GUI如何在保存用户输入的同时在面板或框架之间切换   swing Java自定义JSlider不会更新   GridBagLayout中的java超过1个JPanel   java从ProjectReactor中的flux中采样除第一个元素外的所有元素   Java泛型和泛型类型   Java代码生成宽指令的jvm