Golang中如何利用io.CopyBuffer优化文件复制(当os.File不支持copy_file_range时)

Golang中如何利用io.CopyBuffer优化文件复制(当os.File不支持copy_file_range时) github.com

golang/go/blob/2e773a3894fba7af744090d7d42968f4993018e2/src/os/file.go#L155

	return
}

// ReadFrom implements io.ReaderFrom.
func (f *File) ReadFrom(r io.Reader) (n int64, err error) {
	if err := f.checkValid("write"); err != nil {
		return 0, err
	}
	n, handled, e := f.readFrom(r)
	if !handled {
		return genericReadFrom(f, r) // without wrapping
	}
	return n, f.wrapErr("write", e)
}

func genericReadFrom(f *File, r io.Reader) (int64, error) {
	return io.Copy(onlyWriter{f}, r)
}

type onlyWriter struct {
	io.Writer

如果不支持 copy_file_range,它将回退到使用 io.Copy


更多关于Golang中如何利用io.CopyBuffer优化文件复制(当os.File不支持copy_file_range时)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何利用io.CopyBuffer优化文件复制(当os.File不支持copy_file_range时)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,当os.File不支持copy_file_range时,系统会回退到io.Copy。但我们可以使用io.CopyBuffer来进一步优化文件复制性能,特别是在处理大文件时。io.CopyBuffer允许我们重用缓冲区,减少内存分配和垃圾回收压力。

以下是一个示例代码,展示如何利用io.CopyBuffer优化文件复制:

package main

import (
    "io"
    "os"
)

func copyFileWithBuffer(src, dst string, bufSize int) error {
    // 打开源文件
    srcFile, err := os.Open(src)
    if err != nil {
        return err
    }
    defer srcFile.Close()

    // 创建目标文件
    dstFile, err := os.Create(dst)
    if err != nil {
        return err
    }
    defer dstFile.Close()

    // 创建可重用的缓冲区
    buffer := make([]byte, bufSize)

    // 使用io.CopyBuffer进行复制
    _, err = io.CopyBuffer(dstFile, srcFile, buffer)
    return err
}

func main() {
    // 示例:复制文件,缓冲区大小为32KB
    err := copyFileWithBuffer("source.txt", "destination.txt", 32*1024)
    if err != nil {
        panic(err)
    }
}

在这个示例中,io.CopyBuffer通过预分配的缓冲区(例如32KB)来减少复制过程中的内存分配次数。相比io.Copy(内部使用默认大小的缓冲区并可能多次分配),io.CopyBuffer在频繁复制大文件时能提供更好的性能。注意,缓冲区大小应根据实际场景调整,过小可能增加系统调用次数,过大则浪费内存。

回到顶部