我有一个Go程序,它将字符串写入文件。我有一个循环,它是 20000倍的迭代,并且在每次迭代中我都会在文件中写入约20-30个字符串。我只是想知道哪种是将其写入文件的最佳方法。

  • 方法1:在代码开头始终打开文件指针,然后
    为每个字符串写它。使其进行20000 * 30个写操作。
  • 方法2:使用bytes.Buffer去并将所有内容存储在缓冲区中,然后
    最后写它。在这种情况下,文件指针也应该是
    从代码开头或代码结尾打开。做
    有关系吗

  • 我假设方法2应该更好。有人可以有理由确认这一点。 一次写作要比定期写作更好。因为文件指针始终会打开。
    我正在使用f.WriteString(<string>),并且buffer.WriteString(<some string>)缓冲区的类型为bytes.Buffer,而f是打开的文件指针。

    最佳答案

    bufio软件包正是针对此类任务而创建的。代替对每个Write调用进行syscall,bufio.Writer会在进行syscall之前在内部存储器中缓冲多达固定数量的字节。进行系统调用后,内部缓冲区将重新用于下一部分数据

    比较第二种方法bufio.Writer

  • 进行更多系统调用(用N/S代替1)
  • 使用更少的内存(S字节而不是N字节)

  • 其中S-是缓冲区大小(可以通过bufio.NewWriterSize指定),N-需要写入的数据总大小。

    用法示例(https://play.golang.org/p/AvBE1d6wpT):
    f, err := os.Create("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    
    w := bufio.NewWriter(f)
    fmt.Fprint(w, "Hello, ")
    fmt.Fprint(w, "world!")
    err = w.Flush() // Don't forget to flush!
    if err != nil {
        log.Fatal(err)
    }
    

    10-06 01:55