要拼接的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