Сравнение 2-х текстовых файлов

133
26 февраля 2022, 05:40

Сравниваю 1 и 2 текстовый файл, если в 1 нету тех строк, которые во 2 текстовом файле, то он создает третий текстовый файл и записывает в него. Как ускорить весь процесс, так как это очень долго, занимает очень много оперативной памяти при работе, объем текстовых файлов размером более 1 гб, сейчас работает такой код:

var file1 = File.ReadLines("file1.txt");
var file2 = File.ReadLines("file2.txt");
File.WriteAllLines("Result.txt", file2.Except(file1));

Аналоги которую сортируют ПО так же, занимают при сравнении на много меньше ресурсов и работают шустрее.

Answer 1
  1. Ошибка номер раз - вы читаете весь файл2 в память
  2. Ошибка номер два - вы фильтруете по всей последовательности file2.Except(file1), что неэффективно на больших коллекциях
  3. Ошибка номер три - вы читаете файл1 по строкам, хотя вам он нужен в памяти целиком. Это имееет смысл только если у вас в файле1 очень много повторяющихся строк, в противном случае вы просто жертвуете производительностью на пустом месте (читать файл по строке гораздо медленней, чем читать файл целиком)
  4. Четыре, если вы хотите ускроить работу с файлами, то читайте с буфером и пишите с буфером.

Вот как ваш код может примерно выглядеть:

var set = new HashSet<string>();
foreach(var line in File.ReadAllLines("file1.txt")) set.Add(line);
// размеры буфера установите сами как вам надо, я для пример указал 10 мб
using(var sw = new StreamWriter(new BufferedStream(File.OpenWrite("Result.txt"), 10*1024*1024 ))) 
{
    using(var sr = new StreamReader(new BufferedStream(File.OpenRead("file2.txt"), 10*1024*1024)))
    {
        while(!sr.EndOfStream)
        {
            var line = sr.ReadLine();
            if (!set.Contains(line)) sw.WriteLine(line);
        }
    }
}

UPD

Если предположить, что изначальные файлы сортированы и не содержат дублткатов, то задача становится абсолютно другой и не требует большого потребления памяти - достаточно считывать файлы по строке. Я только добавил буферы на чтение и запись, то есть в итоге програма должна отъедать немного памяти.

Корректность проверяйте сами.

var f1 = @"D:\temp\1071344\file1.txt";
var f2 = @"D:\temp\1071344\file2.txt";
var ret = @"D:\temp\1071344\Result.txt";
using (var sr1 = new StreamReader(new BufferedStream(File.OpenRead(f1), 10 * 1024 * 1024)))
{
    using (var sr2 = new StreamReader(new BufferedStream(File.OpenRead(f2), 10 * 1024 * 1024)))
    {
        using (var sw = new StreamWriter(new BufferedStream(File.Open(ret, FileMode.Create), 10 * 1024 * 1024)))
        {
            if (sr2.EndOfStream) return;
            if (sr1.EndOfStream)
            {
                while (!sr2.EndOfStream) sw.WriteLine(sr2.ReadLine());
                return;
            }
            var l1 = sr1.ReadLine();
            var l2 = sr2.ReadLine();
            while (!sr1.EndOfStream || !sr2.EndOfStream)
            {
                if (sr1.EndOfStream)
                {
                    while (!sr2.EndOfStream) sw.WriteLine(sr2.ReadLine());
                    return;
                }
                if (sr2.EndOfStream) return;
                var comp = string.Compare(l1, l2);
                if (comp < 0) l1 = sr1.ReadLine();
                if (comp == 0)
                {
                    l1 = sr1.ReadLine();
                    l2 = sr2.ReadLine();
                }
                if (comp > 0)
                {
                    sw.WriteLine(l2);
                    l2 = sr2.ReadLine();
                }
            }
        }
    }
}
READ ALSO
Размер картинок для смарфонов

Размер картинок для смарфонов

У меня на сайте есть галерея картинокКартинки в довольно хорошем качестве, где-то 2000х1500

173
Viber не видит Open Graph разметку

Viber не видит Open Graph разметку

Есть сайт, когда ссылку на страницу сайта кидаю, например, в skype, то с сайта подтягивается картинка, тайтл и описание, которые находятся в мета-тегах...

144
Как сделать предпросмотр ссылки на сайт в Telegram?

Как сделать предпросмотр ссылки на сайт в Telegram?

Как можно сделать так, что бы при отправлении ссылки на мой сайт в Telegram отображался предпросмотр открываемой страницы? Не Instant View, а что бы просто...

74
HTML CSS Появление слайдера снизу

HTML CSS Появление слайдера снизу

Друзья! Столкнулся с проблемой при вёрстке страницыДело в том, что снизу появляется слайдер, которого там быть не должно

75