使用 io.Copy() 使稀疏文件膨胀
在使用 io.Copy() 复制文件时,大型稀疏文件往往会不成比例地膨胀在他们的目的地。此行为源于 io.Copy() 对原始字节的处理,它缺乏传达文件漏洞信息的方法。
处理漏洞
管理漏洞,您必须深入研究系统调用包并修改 lseek(2) 的 SEEK_HOLE 和 SEEK_DATA 值。不幸的是,这些值不存在于标准系统调用包或其对应的 golang.org/x/sys 中。
解决方案
要解决此问题,请按照以下步骤操作:
例如,在 Linux 上,您可以使用:
// +build linux const ( SEEK_DATA = 3 SEEK_HOLE = 4 )
读取和传输稀疏文件
检测数据区域并从中读取他们在读取稀疏文件时。为了以完整的稀疏性传输文件,该过程更加复杂,并且需要特定于平台的考虑。
Linux 特定方法
在 Linux 上,使用 fallocate(2) 与FALLOC_FL_PUNCH_HOLE | FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE 在文件末尾打一个洞。如果失败,铲起归零的块来覆盖洞。
附加说明
以上是如何在 Go 中高效复制稀疏文件而不膨胀?的详细内容。更多信息请关注PHP中文网其他相关文章!