Golang从管道中读取大量数据

等等。

我试图读取就是BEING柏油,流媒体,以标准输入存档,但我不知怎么读远远在管道的数据超过焦油发送。

我这样运行我的命令:

tar -cf - somefolder | ./my-go-binary

源代码是这样的:

package main

import (
    "bufio"
    "io"
    "log"
    "os"
)

// Read from standard input
func main() {
    reader := bufio.NewReader(os.Stdin)
    // Read all data from stdin, processing subsequent reads as chunks.
    parts := 0
    for {
        parts++
        data := make([]byte, 4<<20) // Read 4MB at a time
        _, err := reader.Read(data)
        if err == io.EOF {
            break
        } else if err != nil {
            log.Fatalf("Problems reading from input: %s", err)
        }
    }
    log.Printf("Total parts processed: %d\n", parts)
}

对于100MB的涂油文件夹,我将获得1468个4MB的块(即6.15GB)!此外,data []byte数组的大小似乎无关紧要:如果将块大小设置为40MB,我仍然会获得约1400个40MB数据块,这根本没有任何意义。

os.Stdin使用Go正确读取数据,我需要做些什么吗?

彼得

您的代码效率低下。data每次通过循环分配和初始化

for {
    data := make([]byte, 4<<20) // Read 4MB at a time
}

为你的代码reader作为io.Reader是错误的。例如,您忽略了读取的字节数,_, err := reader.Read(data)并且无法err正确处理错误。

套餐io

import "io" 

类型阅读器

type Reader interface {
        Read(p []byte) (n int, err error)
}

Reader是包装基本Read方法的接口。

Read将最多len(p)个字节读入p。它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误。即使Read返回n <len(p),也可能在调用期间将所有p用作暂存空间。如果某些数据可用但不是len(p)个字节,则按常规方式,Read将返回可用数据,而不是等待更多数据。

成功读取n> 0个字节后,当Read遇到错误或文件结束条件时,它将返回读取的字节数。它可能从同一调用返回(非nil)错误,或者从后续调用返回错误(n == 0)。这种一般情况的一个实例是,读取器在输入流的末尾返回非零字节数的情况可能返回err == EOF或err == nil。下一次读取应返回0,无论EOF是否。

在考虑错误err之前,调用者应始终处理返回的n> 0个字节。这样做可以正确处理在读取某些字节后发生的I / O错误,以及两种允许的EOF行为。

不鼓励Read的实现不返回零字节计数且无nil的错误,除非len(p)== 0除外。调用者应将返回0和nil视为没有任何反应;特别是它并不表示EOF。

实现不得保留p。

这是符合io.Reader接口的模型文件读取程序

package main

import (
    "bufio"
    "io"
    "log"
    "os"
)

func main() {
    nBytes, nChunks := int64(0), int64(0)
    r := bufio.NewReader(os.Stdin)
    buf := make([]byte, 0, 4*1024)
    for {
        n, err := r.Read(buf[:cap(buf)])
        buf = buf[:n]
        if n == 0 {
            if err == nil {
                continue
            }
            if err == io.EOF {
                break
            }
            log.Fatal(err)
        }
        nChunks++
        nBytes += int64(len(buf))
        // process buf
        if err != nil && err != io.EOF {
            log.Fatal(err)
        }
    }
    log.Println("Bytes:", nBytes, "Chunks:", nChunks)
}

输出:

2014/11/29 10:00:05字节:5589891块:1365

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从csv读取行中存储的大量数据

来自分类Dev

直接从文件中读取大量bmp数据

来自分类Dev

从csv读取行中存储的大量数据

来自分类Dev

高效读取大量数据

来自分类Dev

多次从具有大量数据的Java InputStream中读取

来自分类Dev

FORTRAN:存储可在MATLAB中读取的大量数据的最佳方法

来自分类Dev

读取API返回的大量数据

来自分类Dev

SQL Profiler中的大量读取

来自分类Dev

在python中读取大量数字

来自分类Dev

您如何组织/读取大量数据?

来自分类Dev

从管道中读取png图像

来自分类Dev

读取终端中的命名管道

来自分类Dev

在Linux中从管道读取值

来自分类Dev

从管道中读取 sudo 密码

来自分类Dev

Golang从文件中读取数据并指示缺少值

来自分类Dev

将大量未清理的数据有效地读取到R中

来自分类Dev

如何读取重定向/管道数据?

来自分类Dev

从命名管道读取连续数据

来自分类Dev

从命名管道读取连续数据

来自分类Dev

在Python中,如何从标准输入读取数据,直到管道进程终止?

来自分类Dev

通过父级读取数据,然后使用c中的管道将其发送给子级

来自分类Dev

在SAS中合并大量数据

来自分类Dev

在LibreOffice中处理大量数据

来自分类Dev

比较PHP中的大量数据

来自分类Dev

在SAS中合并大量数据

来自分类Dev

从MongoDB中删除大量数据

来自分类Dev

在nodejs中获取大量数据

来自分类Dev

管道,管道中的数据如何流动?

来自分类Dev

如何从键盘中读取管道中的命令?