Как использовать оперативную память рационально? - 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)));