【问题标题】:Golang Virtual FileGolang 虚拟文件
【发布时间】:2017-02-28 18:16:44
【问题描述】:

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

该程序旨在处理常规文件,但是我需要从 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之外,还有没有创建虚拟文件的可能?

【问题讨论】:

    标签: hadoop go named-pipes fuse


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我理解问题是闭源程序2需要一个文件名并且不接受直接来自stdin的输入?

      您可以在运行程序时使用标准 Unix 风格的管道将进程的 stdinstdout 连接在一起。命名管道可能会出现问题,为此使用 FUSE 过于复杂。

      你可以让你的program1输出到stdout。并为闭源程序2提供虚拟文件名/dev/stdin,如下所示:

      program1 | program2 /dev/stdin
      

      这是假设您在 Linux 上工作(您没有指定,但我假设是因为您在谈论 FUSE)。

      如果 program2 关心文件名(例如,需要特定的扩展名),您可以通过创建一个符号链接来解决这个问题,该链接的所需名称指向 /dev/stdin,并提供符号链接的名称作为program2的参数:

      ln -s /dev/stdin file.ext
      program1 | program2 file.ext
      rm -f file.ext
      

      如果 program2 需要一个它可以 stat 的真实文件,那么这一切都不会起作用,但在这种情况下,这不应该是一个问题(正如从 program2 接受命名管道的问题中得知的那样) .

      另外,如果 program2 期望来自 stdin 的键盘输入,这种方法将不起作用。

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 1970-01-01
        • 2011-12-03
        • 2010-10-03
        • 2015-11-03
        • 1970-01-01
        • 2015-09-25
        • 2016-09-28
        • 1970-01-01
        相关资源
        最近更新 更多