строку и записываю в map, т.к. это самый быстрый метод, который я знаю, чтобы избежать дубликаты строк. Но размер map[string]bool упирается в оперативную память, т.е. на Windows server с 16 GB RAM он максимум записывает в мапу 218кк пар, а мне нужно больше. Есть какие-то идеи как сделать лучше?
map[string]struct{}
А как юзать, вот допустим есть сканнер var s string m := make(map[string]struct{}) for scanner.Scan() { s = scanner.Text() }
а какова цель в итоге? т.е. что скрывается за тем, что надо вычитывать 218кк+ пар?
Я сканирую допустим 8 файлов разных, записываю в мапу, а потом прохожусь по ключам map чтобы создать новый итоговый файл без дубликатов
Так же, как вы юзаете map[string]bool Каждый bool - это 1 байт
меня немного смущают слова про базу. если это реляционная БД, то почему сразу не писать в неё, обрабатывая исключения на неуникальные поля?
Нет, это я просто так назвал. Я имел ввиду просто текстовый файл в котором много строк)
Я сам себе её поставил, так что именно её я и описал. Если перефразировать, то мне даются файлы(они находятся все в одной папке), мне нужно все их записать в один файл избегая дубликатов
возможно хорошей идеей будет забить на производительность и реализовать тупой брутфорс с перебором каждого элемента по всем файлам паралелльно 🤷♂️
Мы не ищем легких путей)
ну тогда могу предложить сначала сделать mergesort всех файлов в один, а потом просто удалять строчку, которая равна следующей)))
ну вот это можно попробовать
Вы можете сэкономить, кладя не сами строки, а хэши от них. Если, конечно, строки из базы с среднем длиннее длины хэша. upd: Хотя, вероятно вам нужно как-то строками жонглировать потом, а не просто посчитать кол-во уникальных.
Такие задачи всегда через сортировку решаются. Хеши вам уже предлагали, чуть-чуть расширим: csv структурой hash, rowNum, где rowNum - номер строки первого строки в исходом файле, а потом по этому номеру восстанавливаем исходный порядок строк.
А можно проще - залить все в базу и там... А потом экспорт.
Обсуждают сегодня