io.复制原因无法在golang中分配内存

io.复制原因无法在golang中分配内存,go,Go,我使用compress/gzip解压文件 func DecompressZip(src string, target string) error { f, err := os.Open(src) if err != nil { return errors.Wrap(err, "can't open tar source file:"+src) } defer f.Close() zipReader, err := gzip.NewReade

我使用compress/gzip解压文件

func DecompressZip(src string, target string) error {
    f, err := os.Open(src)
    if err != nil {
        return errors.Wrap(err, "can't open tar source file:"+src)
    }
    defer f.Close()
    zipReader, err := gzip.NewReader(f)
    if err != nil {
        return errors.Wrap(err, "can't gzip source file"+src)
    }
    defer zipReader.Close()
    unzipFile, err := CreateFileAnyway(target) // return *os.file
    if err != nil {
        return errors.Wrap(err, "can't create target file"+target)
    }
    defer unzipFile.Close()
    if _, err := io.Copy(unzipFile, zipReader); err != nil {
        return errors.Wrap(err, "can't unzip to file :"+target)
    }
    return nil
}

func CreateFileAnyway(path string) (*os.File, error) {
    if _, err := os.Stat(path); err == nil {
        return os.Create(path)
    } else {
        i := len(path)
        for i > 0 && !os.IsPathSeparator(path[i-1]) {
            i--
        }
        if i > 0 {
            if err := os.MkdirAll(path[:i], 0777); err != nil {
                return nil, err
            }
        }
        return os.Create(path)
    }
}
此代码在io上遇到错误。复制日志:
无法解压缩到文件:**:写入***:无法分配内存

压缩文件300M,未压缩文件为5G。
内存:2048M。

它看起来
CreateFileAnyway()
返回某种内存缓冲区,无法将所有数据保存在内存中(它可能是一个“真实的”
os.File
,但可能在映射到内存的文件系统上?)?或者您的gzip输入文件无效或“恶意”?正如Flimzy所说,请发布它是什么,瞄准一个。这个错误是由
io.Copy
函数返回的。
createfileanyly
是一个为输入创建文件的函数,例如“/opt/no exist dir/tmp.txt”。
createfileanyly
:如果错误是由
io.Copy
返回的,那么它就是一个运行时错误。在这个阶段,我最好的猜测是,您的系统正处于内存不足的边缘。如果您多次调用
DecompressZip
(即同时调用数百或数千个文件),则更可能出现这种情况。运行时错误是指在运行时发生的任何错误(通常与编译时相反)。Go也有恐慌。您的错误显然不是死机,但它是一个错误,发生在运行时,因此它是一个运行时错误:)它看起来
CreateFileAnyway()
返回某种内存缓冲区,无法将所有数据保存在内存中(它可能是一个“真实的”
os.File
,但可能位于映射到内存的文件系统上?)?或者您的gzip输入文件无效或“恶意”?正如Flimzy所说,请发布它是什么,瞄准一个。这个错误是由
io.Copy
函数返回的。
createfileanyly
是一个为输入创建文件的函数,例如“/opt/no exist dir/tmp.txt”。
createfileanyly
:如果错误是由
io.Copy
返回的,那么它就是一个运行时错误。在这个阶段,我最好的猜测是,您的系统正处于内存不足的边缘。如果您多次调用
DecompressZip
(即同时调用数百或数千个文件),则更可能出现这种情况。运行时错误是指在运行时发生的任何错误(通常与编译时相反)。Go也有恐慌。您的错误显然不是恐慌,但它是一个错误,并且发生在运行时,因此它是一个运行时错误:)