2013-09-05 3 views
4

Я признаю, что не могу хранить свои полные данные в памяти, поэтому я хочу передавать части в память и работать с ними, а затем записывать их обратно.Есть ли что-то вроде «противоположности» урожая?

Выход очень полезно ключевое слово, оно сохраняет всю кучу, используя перечислитель и сохранение индекса, ....

Но когда я хочу, чтобы переместить IEnumerable через выход вокруг и записать их обратно в коллекцию/file Мне нужно использовать концепцию перечислителя или есть что-то подобное, как противоположность доходности? Я возглавляю RX, но я не понимаю, решает ли он мою проблему?

public static IEnumerable<string> ReadFile() 
    { 
     string line; 

     var reader = new System.IO.StreamReader(@"c:\\temp\\test.txt"); 
     while ((line = reader.ReadLine()) != null) 
     { 
      yield return line; 
     } 

     reader.Close(); 
    } 

    public static void StreamFile() 
    { 
     foreach (string line in ReadFile()) 
     { 
      WriteFile(line); 
     } 
    } 

    public static void WriteFile(string line) 
    { 
     // how to save the state, of observe an collection/stream??? 
     var writer = new System.IO.StreamWriter("c:\\temp\\test.txt"); 
     writer.WriteLine(line); 

     writer.Close(); 
    } 
+0

Вы можете уточнить ваш вопрос немного больше? Что вы подразумеваете под «shift' IEnumerables' вокруг »? 'IEnumerable ' lazy оценен, что означает, что метод даже не начнет выполнение, пока вы не начнете его итерацию. – Groo

+0

Я имею в виду, я хочу читать данные как блок или поток, обрабатывая их в памяти и записывая их обратно. Прежде чем я прочитал все данные в datatable, зацикленные над ними, преобразованные значения, добавленные столбцы, delted rows, .... и они написали полную datatable back (xml, database, csv, ...). Но данных слишком много (количество данных становится слишком большим), и мне нужно разделить обработку (чтение, обработку, запись) на «блоки» или использовать что-то вроде потоковой передачи. – JohnnyBravo75

ответ

4

В вашем случае, вы можете передать IEnumerable<string> непосредственно WriteFile:

public static void WriteFile(IEnumerable<string> lines) 
{ 
    // how to save the state, of observe an collection/stream??? 
    using(var writer = new System.IO.StreamWriter("c:\\temp\\test.txt")) 
    { 
     foreach(var line in lines) 
      writer.WriteLine(line); 
    } 
} 

Поскольку вход в потоковом через IEnumerable<T>, данные никогда не будут храниться в памяти.

Обратите внимание, что в этом случае вы можете просто использовать File.ReadLines для выполнения чтения, поскольку он уже передает результаты обратно через IEnumerable<string>. С File.WriteAllLines, ваш код может быть сделано (хотя, вы могли бы просто использовать File.Copy):

File.WriteAllLines(outputFile, File.ReadLines(inputFile)); 
+0

Спасибо, это полезно! Но, как я писал, я не только использую файлы, это всего лишь образец. Я также использую XML, ADOAdapter цикл через данные и смещение их между datatables. Прежде чем я захотел загрузить все данные в datatble, но это было слишком много, поэтому я пытаюсь перепроектировать приложение и использовать «потоковое». Как использовать это в других коллекциях или это универсальное решение? – JohnnyBravo75

+1

@ JohnnyBravo75 Вот почему я показал вам первый пример - вы можете просто нажать 'IEnumerable ' вокруг, так как он фактически не оценивает, пока вы не начнете перечислить его. –

+0

@ JohnnyBravo75 Это общее решение - 'IEnumerable ' будет эффективно всегда «потоковым» результатом. Вы ищете что-то другое, или есть причина, по которой вы не отметили это? –

Смежные вопросы