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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.ComponentModel;
 
namespace BigFileReader_Demo {
    class Program {
        static void Main(string[] args) {
            BigFileReader reader = new BigFileReader(@"C:/Test.txt", 50);
            reader.Run();
            Console.ReadLine();
        }
    }
    class BigFileReader{
        private string pathToFile;
        private int count;
        private Queue<string> data = new Queue<string>();
        private EventWaitHandle flagGo = new AutoResetEvent(false);
        private EventWaitHandle flagReady = new AutoResetEvent(false);
 
        public BigFileReader(string path, int linesCount) {
            if (!File.Exists(path)) {
                throw new FileNotFoundException("File not exists!");
            }
            pathToFile = path;
            count = linesCount;
        }
 
        public void  Run() {
            new Thread(ProcessOnLines).Start();
            new Thread(ReadLinesFromFile).Start();
        }
        void ReadLinesFromFile() {
            using (StreamReader sr = File.OpenText(pathToFile)) {
                string line = "";
                flagGo.WaitOne();
                while ((line = sr.ReadLine()) != null) {
                    data.Enqueue(line);
                    if (data.Count == count) {
                        flagReady.Set();
                        flagGo.WaitOne();
                    }
                }
            }
            data.Enqueue(null);
            flagReady.Set();
            flagGo.WaitOne();
        }
        void ProcessOnLines() {
            while (true) {
                flagGo.Set();
                flagReady.WaitOne();
                Console.WriteLine("Processing Next Data Block!");
                while (data.Count != 0) {
                    string line = data.Dequeue();
                    if (line == null) {
                        Console.WriteLine("Data is Empty!");
                        flagGo.Dispose();
                        flagReady.Dispose();
                        return;
                    }
                    //Тут обрабатываем строку из данной группы
                    Console.WriteLine(line);
                    Thread.Sleep(100);
                }
            }
        }
    }
}

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


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

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

12   голосов , оценка 4 из 5
Похожие ответы