Size: a a a

2021 June 13

S

Sergey in Go-go!
Всем привет, в рамках обучения решил сделать задачку:
Есть текстовый файл +-10гигов, необходимо максимально эффективно по памяти и быстро найти сколько раз повторяется определенное слово, набросал такой код https://play.golang.org/p/fXAEiqHlgOj

Проблема в том, что, когда я построчно считываю в отдельной рутине файл и отправляю слайс байт по каналу дальше, у меня иногда обрезается начало строки, а иногда конец (по 1 символу). Причем, чем меньше весит файл, тем реже такой эффект проявляется. Если же я читаю в мейне и не отправляя по каналу считаю количество дубликатов, то строки не обрезаются и все корректно работает.

Есть у кого какие идеи что это может быть?
источник

AB

Andrey Burov in Go-go!
https://golang.org/pkg/bufio/#Reader.ReadLine
ReadLine is a low-level line-reading primitive. Most callers should use ReadBytes('\n') or ReadString('\n') instead or use a Scanner.

используйте https://golang.org/pkg/bufio/#Scanner scanner.Text()
источник

S

Sergey in Go-go!
Пробовал, тоже самое.
источник

AB

Andrey Burov in Go-go!
проблема плавает или на определенном файле постоянная?
источник

S

Sergey in Go-go!
Плавает. Обычные txt, созданные через блокнот на маке.
источник

AB

Andrey Burov in Go-go!
go func(wg *sync.WaitGroup) {
тут это не нужно
источник

AB

Andrey Burov in Go-go!
а как узнали что есть ошибка?
источник

AK

Andrey Kartashov in Go-go!
источник

AK

Andrey Kartashov in Go-go!
"Originally inspired by Blaze"
источник

AK

Andrey Kartashov in Go-go!
Они стремятся к тому, чтобы быть максимально совместимыми
источник

S

Sergey in Go-go!
Залез в функцию strings.Count(), поставил брейкпоинт с условием (n == 0) (тоесть совпадений не найдено. Файлик я создавал так, чтобы на каждой строке было по одному совпадению)  и когда провалился в него увидел, что в строке не хватает первого символа.

Забыл упомянуть, что расхождения проявляются, при попытке подсчета первого или последнего слова в строке, тоесть весь файл заполнен так

test card build и тд, просто набор рандомных слов построчно
источник

S

Sergey in Go-go!
Почему не нужно? Иначе читающая сторона зависнет с ожиданием новых значений.
источник

AB

Andrey Burov in Go-go!
я про передачу WG как аргумента
источник

AB

Andrey Burov in Go-go!
а если все строки выводить? первый символ тупо пропадает что ли?
источник

AB

Andrey Burov in Go-go!
аааа, блин... слова теряются а не символы
источник

S

Sergey in Go-go!
ну тоесть строка должна быть

test card build и тд

А с какой-то вероятностю возвращается

est card build и тд
источник

AB

Andrey Burov in Go-go!
если сразу после readline добавить printf data, тоже обрезанное получается?
источник

S

Sergey in Go-go!
в 10 гиговом файле под 90 миллионов строк, я так не посмотрю)  Только если сразу сделаю if strings.Count() = 0 {}, сек
источник

AB

Andrey Burov in Go-go!
The returned buffer is only valid until the next call to ReadLine.
источник

AB

Andrey Burov in Go-go!
условно вам нужно
data, _, err := reader.ReadLine()
if err == io.EOF {
   break
}


заменить на
data, _, err := reader.ReadLine()
if ....
dc := make([]byte, len(data))
copy (dc ,data)
источник