@Nubzilo
Изучаю C#

Как обработать огромный текстовый файл?

Добрый вечер. Как наиболее быстро или просто возможно осуществить такую задачу:
Есть 2 огромных текстовых файла. В 1 - 70 млн строк, в 2 - 60 млн строк.
Задача - извлечь в файл 3 все строки из 1 файла которые не встречаются во 2. Тоесть извлечь все уникальные строки из первого по отношению ко второму файлу.
  • Вопрос задан
  • 1083 просмотра
Решения вопроса 4
@mikhail_404
Используйте хэширование для данной задачи.
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
Решение "в лоб" вас по скорости уже не устраивает? Предполагаю, что оно решит задачу за минуты.
Ответ написан
lam0x86
@lam0x86
Если строки короткие, то, в принципе, подойдёт такое решение:
var secondFileLines = new HashSet<string>(File.ReadLines("<файл2>"));
using (var writer = new StreamWriter("<файл3>"))
{
    foreach (var line in File.ReadLines("<файл1>"))
    {
        if (!secondFileLines.Contains(line))
        {
            writer.WriteLine(line);
        }
    }
}


Если длина строк неограничена, то могут возникнуть проблемы с расходом памяти. В этом случае, всё сильно усложняется. Вам, вероятно, придётся хранить набор хэш-кодов строк из второго файла и сравнивать с хэш-кодом каждой строки из первого. Но тут могут возникнуть ложно-положительные срабатывания, если у разных строк хэши будут совпадать. В этом случае, необходимо будет сравнивать строки посимвольно. Это при идеальной реализации. Впрочем, вероятность совпадения хэшей - 1/2^32. Ну, и надо умножить на 70 миллионов. Если задача позволяет добавить пару лишних строк в результирующий файл, я бы так и поступил.
Можно немного улучшить алгоритм с хэшами: если, например, использовать 256-битную хэш-функцию, а не стандартную (GetHashCode), можно снизить вероятность ложного срабатывания до 1e-77 (в случае использования SHA1). Думаю, такой мизерной вероятности будет достаточно, чтобы считать задачу решённой. Правда, придётся немного усложнить алгоритм сравнения хэшей - придётся сравнивать массивы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
bobrovskyserg
@bobrovskyserg
Отсортируйте оба файла.
Дальше просто:
считываете по строке из файлов -> сравниваете->записываете/пропускаете -> считываете еще строки по мере надобности. Очень похоже на сортировку слиянием.
Ответ написан
@beduin01
Пример легко адаптируемый под вашу задачу описан в самом начале книги: The D Programming Language.

Там очень просто. Я недавно нечто подобное делал, правда строк было не миллион а около 700 тыс.
Ответ написан
Комментировать
saintbyte
@saintbyte
Django developer
Хеши , external sort и сравнивать хеши , потом искать по хешу
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы