繁体   English   中英

io.Copy比调用mv命令要慢很多

[英]io.Copy is a lot slower than calling the mv command

看来io.Copy对我来说很慢:

   _,err = io.Copy(destf,srcf)

io.Copy需要更长时间,大约2分钟将1GB文件复制到网络共享。 注意到mv.exe在最多约25秒内完成了这项工作 - 所以我开始为我的工作唤起mv。

    output, err := exec.Command("mv", src, dest_folder).CombinedOutput()

这种缓慢在我的最终可以重现,任何有关如何演奏的提示将非常感谢!

更新:

感谢您使用io.CopyBuffer()的建议,但是mv.exe仍然以唯一的优势成为唯一的胜利者。

细节:

PS C:\temp> .\move_files.exe .\testfile.data "\\somehost\somefolder\bleh13.txt"
2018/07/14 19:04:54 Created C:\Temp\2\deleteME__913153343, copy of .\testfile.data, Size: 1073745920 bytes
2018/07/14 19:05:55 Transfer with io.Copy() took us 60.836702 seconds
2018/07/14 19:06:47 Transfer with io.CopyBuffer() took us 50.729625 seconds
2018/07/14 19:06:59 Transfer with mv command took us 11.470456 seconds
PS C:\temp>

欢迎您自己尝试: https//play.golang.org/p/2_lR83A4BXe

你比较副本和移动是不同的东西。 移动文件不会假设将所有数据的副本写入新的物理内存目标,只是重写文件系统中的某些标头/描述符。 所以适当的比较基准

也许尝试io.CopyBufferio.Copy使用32 * 1024字节缓冲区

检查更大或更小的缓冲区大小是否有所不同。

继续我的评论建议尝试CopyFile Win32 API函数,这是一个包装它的工作程序:

package main

import (
    "log"
    "os"
    "syscall"
    "unsafe"
)

var (
    kernel32     = syscall.MustLoadDLL("kernel32.dll")
    copyFileProc = kernel32.MustFindProc("CopyFileW")
)

func CopyFile(src, dst string, overwrite bool) error {
    srcW := syscall.StringToUTF16(src)
    dstW := syscall.StringToUTF16(dst)

    var failIfExists uintptr
    if overwrite {
        failIfExists = 0
    } else {
        failIfExists = 1
    }

    rc, _, err := copyFileProc.Call(
        uintptr(unsafe.Pointer(&srcW[0])),
        uintptr(unsafe.Pointer(&dstW[0])),
        failIfExists)
    if rc == 0 {
        return &os.PathError{
            Op:   "CopyFile",
            Path: src,
            Err:  err,
        }
    }
    return nil
}

func main() {
    log.SetFlags(0)

    if len(os.Args) != 3 {
        log.Fatalf("Wrong # args.\nUsage: %s SOURCE DEST\n", os.Args[0])
    }

    err := CopyFile(os.Args[1], os.Args[2], false)
    if err != nil {
        log.Fatal("error copying file: ", err)
    }
}

请尝试一下,看看它是否比io.Copy*提高了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM