0

Golang: Как эффективно определить количество строк в файле?

14

Я ищу эффективный способ подсчитать количество строк в файле на языке Golang.

Конечно, я могу просто пройтись по всему файлу в цикле, но это не кажется очень эффективным подходом.

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

Существует ли более быстрый и менее затратно ресурсов способ узнать, сколько строк в файле?

1 ответ(ов)

0

Чтобы подсчитать количество новых строк в файле, вы можете использовать следующий код на Go:

// Константа для обозначения символа новой строки, нет необходимости преобразовывать его при каждом вызове newlines_in_file.
var newline_char = []byte("\n")

// Не используйте интерфейсы, если вам не нужно работать с разными источниками (файлы, сеть и т.д.).
func newlines_in_file(r *os.File) (lines int, err error) {
    var (
        n   int
        buf = [256]byte{} // Буфер, выделенный в стеке
    )

    // Установите условие на цикл
    for err == nil {
        n, err = r.Read(buf[:])
        lines += bytes.Count(buf[:n], newline_char)
    }

    // Если возможно, избегайте использования if и switch внутри циклов, это условие можно вынести за цикл
    if err != io.EOF {
        return lines, err
    }

    // Счастливый путь - последнее выражение
    return lines, nil
}

Этот код не использует io.Reader, что позволяет избежать выделения памяти, так как он использует буфер, выделенный в стеке.

BenchmarkLines-12        2990632               391.6 ns/op             0 B/op          0 allocs/op

Таким образом, этот подход демонстрирует отличную производительность без необходимости дополнительного выделения памяти.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь