Как использовать оперативную память рационально? - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть код программы, где я сравниваю 2 текстовых файла, и если n-строка в первом не находит идентичную во втором, то она записывается в новый файл. Файлы большие и при j=167772 вылазит ошибка - Необработанное исключение типа "System.OutOfMemoryException" в mscorlib.dll.
List<string> iskl1 = new List<string>();
            List<string> isklob = new List<string>();
            StreamReader sr1iskl = new StreamReader("D:\\Program\\farVariant.txt");
            string stroka1;
            while ((stroka1 = sr1iskl.ReadLine()) != null)
            { iskl1.Add(stroka1); }
            List<string> iskl2 = new List<string>();
            StreamReader sr2iskl = new StreamReader("D:\\Program\\IskVariantOB.txt");
            string stroka2;
            while ((stroka2 = sr2iskl.ReadLine()) != null)
            { iskl2.Add(stroka2); }
            for (int j = 0; j < iskl1.Count; j++)
            {
                for (int i = 0; i < iskl2.Count; i++)
                {
                    if (iskl1[j] != iskl2[i])
                    {
                        isklob.Add(iskl1[j]);
                    }
                }
 
            } File.WriteAllLines("D:\\Program\\variantfinal.txt", isklob);
Пытаясь найти решение, я полез в интернет и наткнулся на тему "LINQ и итераторы" где возможен вариант, когда мы не держим полный объем данных в памяти, а обрабатываем от начала до конца все данные поэлементно. Мы всего раз проходим по всему объему данных и держим в памяти всего один элемент данных, то есть одну строку. Там прилагается код подобный моему
using System;
using System;
using System.Collections.Generic;
using System.Text;
 
namespace EnumerableDemo.Bad
{
 public class StringTransformer
 {
  IDictionary<string, string> _catalog = new Dictionary<string, string>
  {
   {"012345", "Car"},
   {"012346", "Bus"},
   {"012347", "Train"}
  };
 
  public StringTransformer()
  {
   _catalog.Add("%Date%", DateTime.Now.ToString("d"));
  }
 
  public IList<string> Transform(IList<string> strs)
  {
   var list = new List<string>();
 
   foreach (var item in strs)
   {
    var builder = new StringBuilder(item);
    foreach (var key in _catalog.Keys)
    {
     builder.Replace(key, _catalog[key]);
    }
    list.Add(builder.ToString());
   }
 
   return list;
  }
 }
}
И предлагается решение в виде
using System;
using System.Collections.Generic;
using System.IO;
 
namespace EnumerableDemo.Good
{
 class MainClass
 {
  public static IEnumerable<string> ReadInput()
  {
   using (var file = File.OpenText("input.txt"))
   {
    while (!file.EndOfStream)
    {
     yield return file.ReadLine();
    }
   }
  }
 
  public static void WriteOutput(IEnumerable<string> strs)
  {
   using (var file = File.CreateText("output.txt"))
   {
    foreach (var str in strs)
    {
     file.WriteLine(str);
    }
   }
  }
 
  public static void Main(string[] args)
  {
   var stringTransformer = new StringTransformer();
   var input = ReadInput().Where(str=>str.Length > 5);
   var transformed = stringTransformer.Transform(input);
   WriteOutput(transformed);
  }
 }
}
Можно ли как-нибудь мне сделать аналогично? Чтоб не насиловать память и уменьшить время обработки?

Решение задачи: «Как использовать оперативную память рационально?»

textual
Листинг программы
            var firstFile = File.ReadLines("c:\\1.txt");
            var secondFile = new HashSet<string>(File.ReadAllLines("c:\\2.txt"));
 
            File.WriteAllLines("c:\\3.txt", firstFile.Where(s=>!secondFile.Contains(s)));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы