Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
iMCrazy
1 / 1 / 2
Регистрация: 12.10.2014
Сообщений: 32
#1

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

20.04.2015, 17:05. Просмотров 511. Ответов 5
Метки нет (Все метки)

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

http://www.cyberforum.ru/csharp-beginners/thread1817483.html

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2015, 17:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Считывание файла без загрузки его в память (C#):

Считывание текста из файла и вывод в другой файл предложения без запятых
Составить программу, которая считывает текст из файла и выводит на экран и в...

Как прописать автозапуск файла после его загрузки?
Написал я код для загрузки файла с сервера на комп значит, а вот теперь вопрос,...

Как извлечь имя файла без его полного пути и расширения?
как извлечь имя файла без его полного пути и расширения? какой код для кнопки...

Шифрация большого файла без создания его копии для экономии места
Шифрую и дешифрую файл AES вот таким способом( копипаста с msdn) public void...

Удаление изображений после загрузки их в память
Доброго времени суток. Возникла проблема, которую постараюсь кратко описать:...

5
insite2012
Модератор
Эксперт .NET
4790 / 3749 / 1081
Регистрация: 12.10.2013
Сообщений: 10,986
Записей в блоге: 2
20.04.2015, 17:19 #2
iMCrazy, считывайте в память определенное количество строк (лучше это вынести в отдельный поток), работаете с ними, потом читаете сл. порцию и так далее.
1
iMCrazy
1 / 1 / 2
Регистрация: 12.10.2014
Сообщений: 32
20.04.2015, 17:21  [ТС] #3
insite2012, А как считать в память определённое кол-во строк? Я даже понятия не имею как это сделать
0
OwenGlendower
Супер-модератор
Эксперт .NET
8748 / 7752 / 3318
Регистрация: 17.03.2014
Сообщений: 15,252
Записей в блоге: 1
20.04.2015, 18:32 #4
iMCrazy, используй StreamReader + ReadLine в цикле или метод File.ReadLines
1
insite2012
Модератор
Эксперт .NET
4790 / 3749 / 1081
Регистрация: 12.10.2013
Сообщений: 10,986
Записей в блоге: 2
20.04.2015, 20:01 #5
Лучший ответ Сообщение было отмечено iMCrazy как решение

Решение

iMCrazy, вот как-то так, в двух потоках. Один читает определенное количество строк, потом встает на паузу, в это время работает второй, который их обрабатывает. Как второй обработал группу - опять стартует первый, а второй ожидает. И так по кругу.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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);
                }
            }
        }
    }
}
1
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
31.10.2016, 01:30 #6
Цитата Сообщение от insite2012 Посмотреть сообщение
потом встает на паузу, в это время работает второй
А зачем тогда два потока? Делали бы синхронный вызов ProcessOnLines() в соответствующих местах метода ReadLinesFromFile(). И тогда синхронизацию можно выкинуть на помойку.
0
31.10.2016, 01:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2016, 01:30
Привет! Вот еще темы с решениями:

SharpDevelop, получить название файла без расширения и прибавить 14 дней к дате которая в первой его строке
содержимое 1000.txt файла 2014-08-13 13:50:19 126.48.232.103 2014-08-23...

Считывание переменной без нажатия Enter
Как считать переменную без нажатия Enter ?

Считывание текста и вывод его на экран
написать програму которая считывает текст из файла и выводит на экран тоолько...

Запись массива структур в бинарный файл и считывание его
Есть такая структура: struct table { public string name; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru