Как использовать оперативную память рационально? - C#
Формулировка задачи:
Здравствуйте. Есть код программы, где я сравниваю 2 текстовых файла, и если n-строка в первом не находит идентичную во втором, то она записывается в новый файл. Файлы большие и при j=167772 вылазит ошибка - Необработанное исключение типа "System.OutOfMemoryException" в mscorlib.dll.
Пытаясь найти решение, я полез в интернет и наткнулся на тему "LINQ и итераторы" где возможен вариант, когда мы не держим полный объем данных в памяти, а обрабатываем от начала до конца все данные поэлементно. Мы всего раз проходим по всему объему данных и держим в памяти всего один элемент данных, то есть одну строку.
Там прилагается код подобный моему И предлагается решение в виде Можно ли как-нибудь мне сделать аналогично? Чтоб не насиловать память и уменьшить время обработки?
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);
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)));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д