gpt4 book ai didi

hadoop - Golang 虚拟文件

转载 作者:可可西里 更新时间:2023-11-01 16:29:39 25 4
gpt4 key购买 nike

我有一个封闭的 source 应用程序,它将一个文件作为输入,计算它的哈希值并做一些我无法控制的其他事情。修改源代码或逆向工程是不可行的。

该程序旨在处理常规文件,但我需要从 HDFS 提供一个非常大的文件。复制文件会占用太多时间和磁盘空间。所以一直在想用FUSE,但是没找到好的解决办法。我尝试使用命名管道如下:

func readFile(namenode, path string, pipe *os.File) {
client, err := hdfs.New(namenode)
log.Println(err, client)

hdfsFile, err := client.Open(path)
if err != nil {
log.Fatal(err)
}
log.Println(hdfsFile)

// written, err := io.Copy(pipe, hdfsFile)
bytes := make([]byte, 4096)
for {
read, err := hdfsFile.Read(bytes)
log.Println(read, err)
if err != nil {
break
}
written, err := pipe.Write(bytes)
log.Println(written, err)
}
err = pipe.Close()
log.Println(err)
}

我知道上面的代码不完整,测试文件是 10MB,但是在读取 8 次后,4096 字节的命名管道缓冲区变满,另一个程序将其全部占用并关闭管道。

但是过了一会儿,另一个正在读取管道的程序关闭了管道,我得到了管道损坏的错误。是否有可能创建除 fuse 和 pipe 之外的虚拟文件?

最佳答案

我认为您对 FUSE 的想法是正确的。如果没有上游应用程序的源代码,就很难说出它试图使用什么文件语义(尽管使用 strace 的一些时间可能有助于阐明正在发生的事情。也许......)。

无论如何,我会看看 the Go-FUSE project , 具体来说 the hello.go example ,它准确地展示了如何很好地处理单个文件的情况。

关于hadoop - Golang 虚拟文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40125764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com