Мне было предложено создать метод, который будет читать в очень больших текстовых файлах в программу, эти файлы могут варьироваться от 2 до 100 гб.Чтение очень больших текстовых файлов, следует ли включать async?
Идея до сих пор заключалась в том, чтобы прочитать несколько тысяч строк текста в методе.
В настоящий момент программа настроена с использованием считывателя потока, который читает файл по строкам и обрабатывает необходимые области данных, найденных на этой линии.
using (StreamReader reader = new StreamReader("FileName"))
{
string nextline = reader.ReadLine();
string textline = null;
while (nextline != null)
{
textline = nextline;
Row rw = new Row();
var property = from matchID in xmldata
from matching in matchID.MyProperty
where matchID.ID == textline.Substring(0, 3).TrimEnd()
select matching;
string IDD = textline.Substring(0, 3).TrimEnd();
foreach (var field in property)
{
Field fl = new Field();
fl.Name = field.name;
fl.Data = textline.Substring(field.startByte - 1, field.length).TrimEnd();
fl.Order = order;
fl.Show = true;
order++;
rw.ID = IDD;
rw.AddField(fl);
}
rec.Rows.Add(rw);
nextline = reader.ReadLine();
if ((nextline == null) || (NewPack == nextline.Substring(0, 3).TrimEnd()))
{
d.ID = IDs.ToString();
d.Records.Add(rec);
IDs++;
DataList.Add(d.ID, d);
rec = new Record();
d = new Data();
}
}
}
Программа продолжается и заполняет класс. (просто решил не оставлять остальное)
Я знаю, что, как только программа будет показана чрезвычайно большой файл, будут возникать ошибки исключения памяти.
, так что это моя текущая проблема, и до сих пор я искал несколько подходов, многие люди просто отвечали на использование чтения и чтения потоков. Readtoend, я знаю, что readtoend не будет работать для меня, поскольку я получу эти ошибки памяти.
Наконец, я изучал async как способ создания метода, который будет читать определенное количество строк и ждать вызова до обработки следующего количества строк.
Это подводит меня к моей проблеме. Я изо всех сил пытаюсь понять асинхронный процесс, и я не могу найти какой-либо материал, который поможет мне учиться и надеялся, что кто-то здесь сможет помочь мне с пониманием асинхронности.
Конечно, если кто-нибудь знает, как лучше решить эту проблему, я все уши.
EDIT Добавлен остаток кода, чтобы положить конец любой путанице.
Я не вижу никакой необходимости в асинхронности здесь. Похоже, вам нужно передавать данные, но можете обрабатывать их полностью синхронно. – Servy
Где происходят исключения памяти (какая строка)? Как вы читаете следующую строку? Что такое xmldata? Как долго длится каждая строка в файле? – Polyfun
Если вы используете .NET 4.0, библиотека задач - отличный способ управлять асинхронными потоками. BlockingCollection - отличный способ справиться с ситуацией с производителем, которую вы могли бы использовать в этом случае. Прочитайте некоторые данные из потока и добавьте их в очередь, затем выполните одну из следующих потоков, обрабатывающих эту очередь. – cgotberg