当前位置: 首页 > 面试题库 >

Golang:如何有效确定文件中的行数?

董子航
2023-03-14
问题内容

在Golang中,我正在寻找一种有效的方法来确定文件的行数。

当然,我总是可以遍历整个文件,但效率似乎并不高。

file, _ := os.Open("/path/to/filename")
fileScanner := bufio.NewScanner(file)
lineCount := 0
for fileScanner.Scan() {
    lineCount++
}
fmt.Println("number of lines:", lineCount)

有没有一种更好的方法(更快,更便宜)来找出文件有多少行?


问题答案:

这是bytes.Count用于查找换行符的更快的行计数器。

它之所以更快,是因为它消除了返回整行所需的所有额外逻辑和缓冲,并利用了字节包提供的某些程序集优化功能来搜索字节片中的字符。

较大的缓冲区在这里也有帮助,尤其是对于较大的文件。在我的系统上,使用我用于测试的文件,32k缓冲区是最快的。

func lineCounter(r io.Reader) (int, error) {
    buf := make([]byte, 32*1024)
    count := 0
    lineSep := []byte{'\n'}

    for {
        c, err := r.Read(buf)
        count += bytes.Count(buf[:c], lineSep)

        switch {
        case err == io.EOF:
            return count, nil

        case err != nil:
            return count, err
        }
    }
}

和基准输出:

BenchmarkBuffioScan   500      6408963 ns/op     4208 B/op    2 allocs/op
BenchmarkBytesCount   500      4323397 ns/op     8200 B/op    1 allocs/op
BenchmarkBytes32k     500      3650818 ns/op     65545 B/op   1 allocs/op


 类似资料:
  • 问题内容: 我的档案很大。它包括大约3.000-20.000行。如何使用Java获取文件中的行总数? 问题答案: BufferedReader reader = new BufferedReader(new FileReader(“file.txt”)); int lines = 0; while (reader.readLine() != null) lines++; reader.close(

  • 问题内容: 我正在向程序中添加一些功能,以便可以通过读取MIME数据来准确确定文件类型。我已经尝试了几种方法: 方法1: 方法2: 方法3: 我在http://www.rgagnon.com/javadetails/java-0487.html上找到了这三种方法。但是我的问题是,我正在测试这些方法的文件是我创建的文件,所以我知道它是一个Excel文件,但是除第一个方法(我认为这是由于该方法使用的内

  • 问题内容: 在C ++中,我可以打印调试输出,如下所示: 如何在Python中做类似的事情? 问题答案: 有一个名为的模块可提供这些信息。 用法示例: 但是,请记住,有一种更简单的方法来获取当前正在执行的文件的名称:

  • 问题内容: 我试图找到一种解析文件的方法,该文件包含固定宽度的线。例如,前20个字符代表一列,从21:30开始代表另一列,依此类推。 假设该行包含100个字符,将行解析为多个组件的有效方法是什么? 我可以每行使用字符串切片,但是如果行很大,这会有点难看。还有其他快速方法吗? 问题答案: 由于Python标准库的模块是用C编写的,因此使用它非常容易而且非常快捷。 这是可以用来完成您想要的事情的方法。

  • 问题内容: 我有一种情况,我必须解析来自不同来源的CSV文件,解析代码非常简单明了。 我的问题来自CSV分隔符,我有许多不同的格式,有时是有时是 有什么方法可以在解析文件之前确定定界符 问题答案: univocity-parsers支持自动检测定界符(也包括行尾和引号)。只需使用它而不是与您的代码作斗争: 免责声明:我是该库的作者,并且确保确保涵盖了各种极端情况。它是开源且免费的(Apache 2

  • 导入: 是由路径\org\apache\log4j\Logger确定的包名“org.apache.log4j”。班