Считывание файла без загрузки его в память - C#

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

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

Приветствую всех, столкнулся с проблемой имею текстовый документ(более 20млн строк). Нужно реализовать построчное считывание файла без загрузки в память (база более 20млн хрен загрузишь без лагов)

Решение задачи: «Считывание файла без загрузки его в память»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Threading;
  7. using System.ComponentModel;
  8.  
  9. namespace BigFileReader_Demo {
  10.     class Program {
  11.         static void Main(string[] args) {
  12.             BigFileReader reader = new BigFileReader(@"C:/Test.txt", 50);
  13.             reader.Run();
  14.             Console.ReadLine();
  15.         }
  16.     }
  17.     class BigFileReader{
  18.         private string pathToFile;
  19.         private int count;
  20.         private Queue<string> data = new Queue<string>();
  21.         private EventWaitHandle flagGo = new AutoResetEvent(false);
  22.         private EventWaitHandle flagReady = new AutoResetEvent(false);
  23.  
  24.         public BigFileReader(string path, int linesCount) {
  25.             if (!File.Exists(path)) {
  26.                 throw new FileNotFoundException("File not exists!");
  27.             }
  28.             pathToFile = path;
  29.             count = linesCount;
  30.         }
  31.  
  32.         public void  Run() {
  33.             new Thread(ProcessOnLines).Start();
  34.             new Thread(ReadLinesFromFile).Start();
  35.         }
  36.         void ReadLinesFromFile() {
  37.             using (StreamReader sr = File.OpenText(pathToFile)) {
  38.                 string line = "";
  39.                 flagGo.WaitOne();
  40.                 while ((line = sr.ReadLine()) != null) {
  41.                     data.Enqueue(line);
  42.                     if (data.Count == count) {
  43.                         flagReady.Set();
  44.                         flagGo.WaitOne();
  45.                     }
  46.                 }
  47.             }
  48.             data.Enqueue(null);
  49.             flagReady.Set();
  50.             flagGo.WaitOne();
  51.         }
  52.         void ProcessOnLines() {
  53.             while (true) {
  54.                 flagGo.Set();
  55.                 flagReady.WaitOne();
  56.                 Console.WriteLine("Processing Next Data Block!");
  57.                 while (data.Count != 0) {
  58.                     string line = data.Dequeue();
  59.                     if (line == null) {
  60.                         Console.WriteLine("Data is Empty!");
  61.                         flagGo.Dispose();
  62.                         flagReady.Dispose();
  63.                         return;
  64.                     }
  65.                     //Тут обрабатываем строку из данной группы
  66.                     Console.WriteLine(line);
  67.                     Thread.Sleep(100);
  68.                 }
  69.             }
  70.         }
  71.     }
  72. }

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


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

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

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы