golang 逐行读取文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 逐行读取文件相关的知识,希望对你有一定的参考价值。

func scanFile() {
    f, err := os.OpenFile(logfile, os.O_RDONLY, os.ModePerm)
    if err != nil {
        log.Fatalf("open file error: %v", err)
        return
    }
    defer f.Close()

    sc := bufio.NewScanner(f)
    for sc.Scan() {
        _ = sc.Text()  // GET the line string
    }
    if err := sc.Err(); err != nil {
        log.Fatalf("scan file error: %v", err)
        return
    }
}

逐行读取文件——对磁盘有影响吗?

【中文标题】逐行读取文件——对磁盘有影响吗?【英文标题】:Reading a file line by line -- impact on disk? 【发布时间】:2016-05-26 04:39:43 【问题描述】:

我目前正在编写一个处理非常大 (> 10GB) 文件的 python 脚本。由于无法将整个文件加载到内存中,我现在正在逐行读取和处理它:

for line in f:
....

脚本完成后,它会经常运行,所以我开始考虑这种读取方式会对我的磁盘寿命产生什么影响。

脚本会实际上逐行读取,还是会发生某种操作系统驱动的缓冲?如果没有,我应该自己实现某种中间缓冲区吗?经常敲击磁盘实际上是有害的吗?我记得读过一些关于 BitTorrent 快速磨损磁盘的文章,正是因为这种按位读取/写入而不是操作更大的数据块。

我在测试环境中同时使用 HDD 和 SSD,因此这两个系统的答案都会很有趣。

【问题讨论】:

无论你的脚本做什么,它都会导致磁盘上最简单的顺序读取。没有比这更高效且磁盘磨损更少的了。别担心。操作系统的缓冲、缓存和预取将确保您获得良好的性能,而无需您采取进一步的行动。 【参考方案1】:

出于性能原因,您的操作系统和 Python 都使用缓冲区来读取较大块的数据。从 Python 逐行读取文件不会对您的磁盘造成重大影响。

具体来说,Python 无法在不提前扫描以查找行分隔符的情况下为您提供单独的行,因此它会读取块,解析出单独的行,并且每次迭代都会从缓冲区中获取行,直到必须读取另一个块才能找到下一组线。操作系统通常使用buffer cache 来帮助加快 I/O。

【讨论】:

以上是关于golang 逐行读取文件的主要内容,如果未能解决你的问题,请参考以下文章

golang 逐行读取文件

Golang逐行读取大文件性能对比

nodejs的readline怎么支持字符串逐行读取

Bash怎么逐行读取一个文件

DELPHI中逐行读取并复制

python逐行读取文件脚本