Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
13 / 13 / 13
Регистрация: 05.07.2011
Сообщений: 233
1

Многопоточное чтение больших файлов

15.08.2016, 13:43. Показов 3159. Ответов 37
Метки нет (Все метки)

Доброго времени суток! Нужен совет.
Имеется, скажем, 10 текстовых файлов 1.txt;2.txt и т.д. и метод, которому на вход подаётся строка из текстового файла. Подскажите, как грамотно организовать 10 потоков, которые будут параллельно и независимо дург от друга просматривать каждый свой файл этим методом?
Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2016, 13:43
Ответы с готовыми решениями:

Чтение больших файлов Excel
пытаюсь считать данные с XLSX файла (500 000 строк). на MSDN наткнутся на статью каким образом это...

Чтение файлов больших размеров >1Гб
Товарищи, подскажите как прочитать файл размером больше 1Гб.. у меня при чтении оперативка...

Многопоточное чтение файла
Здравствуйте. Есть задача: читать большой файл блоками в x байт и потом с этими блоками что-то...

Многопоточное грязное чтение
В этом моменте происходит перезапись значения object rad= (object)value; ...

37
Эксперт .NET
9431 / 6801 / 1092
Регистрация: 21.01.2016
Сообщений: 25,805
15.08.2016, 14:06 2
Setplus, жёсткий диск - штука медленная. Пытать его десятью потоками не рекомендуется, ибо станет только хуже (медленнее). Один, ну максимум два потока, но не больше.
0
13 / 13 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 14:10  [ТС] 3
В этих файлах довольно много строк (порядка 10 млн). Может, тогда посоветуете, как грамотнее организовать работу с этими файлами?
0
Эксперт .NET
9431 / 6801 / 1092
Регистрация: 21.01.2016
Сообщений: 25,805
15.08.2016, 14:17 4
Setplus, я вижу один выход - загрузить эти файлы в оперативку и работать с ними в ней.
0
13 / 13 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 14:18  [ТС] 5
Не предложите пример кода, хотя бы для двух файлов, чтобы было понятно?
0
.NET C#,ASP.NET MVC
Эксперт .NET
590 / 501 / 225
Регистрация: 16.10.2010
Сообщений: 1,902
15.08.2016, 14:24 6
C#
1
2
var file1Strings = File.ReadAllLines(@"C:\filename1.txt");
var file2Strings = File.ReadAllLines(@"C:\filename2.txt");
0
13 / 13 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 14:25  [ТС] 7
не уверен, что хватит места, если файл - размера порядка 20-40 Гб.
0
Эксперт .NET
7792 / 5257 / 1251
Регистрация: 25.05.2015
Сообщений: 16,028
Записей в блоге: 14
15.08.2016, 14:27 8
https://msdn.microsoft.com/en-... .110).aspx
Читает построчно, по необходимости.
0
.NET C#,ASP.NET MVC
Эксперт .NET
590 / 501 / 225
Регистрация: 16.10.2010
Сообщений: 1,902
15.08.2016, 14:28 9
Тогда используйте
C#
1
File.ReadLines(string fileName)
0
13 / 13 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 14:29  [ТС] 10
Хорошо, тогда, возвращаясь к моей теме, предложите, пожалуйста, пример параллельного кода.
0
Эксперт .NET
9431 / 6801 / 1092
Регистрация: 21.01.2016
Сообщений: 25,805
15.08.2016, 14:32 11
Setplus, если файлы размера 20-40 Гб, то в параллель такое читать не надо

Добавлено через 34 секунды
А вообще, каков предполагаемый сценарий работы с этими файлами?
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 14:48 12
Цитата Сообщение от Usaga Посмотреть сообщение
жёсткий диск - штука медленная. Пытать его десятью потоками не рекомендуется, ибо станет только хуже (медленнее). Один, ну максимум два потока, но не больше.
может у человека SSD.
0
.NET C#,ASP.NET MVC
Эксперт .NET
590 / 501 / 225
Регистрация: 16.10.2010
Сообщений: 1,902
15.08.2016, 14:58 13
Цитата Сообщение от aquaMakc Посмотреть сообщение
может у человека SSD.
Тогда он убьет его еще быстрее
0
aquaMakc
15.08.2016, 15:00
  #14

Не по теме:

Цитата Сообщение от lvlkoo Посмотреть сообщение
Тогда он убьет его еще быстрее
убивает не чтение, убивает запись. Хотя, текстовый файл на 10 млн. строк - это явный признак, что что-то делается не так.

0
13 / 13 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 15:17  [ТС] 15
Сценарий такой:
имеется функция, которой на вход подаётся на вход строка, и если в ней есть определённое слово, то возвращает true.
Хотелось бы, чтобы файлы эти параллельно просматривались, а не последовательно, т.е. чтобы эта функция вызывалась в 10 потоках, а не последовательно просматривала каждый файл..
0
630 / 569 / 166
Регистрация: 17.07.2012
Сообщений: 1,617
Записей в блоге: 1
15.08.2016, 15:25 16
Цитата Сообщение от Setplus Посмотреть сообщение
чтобы эта функция вызывалась в 10 потоках
А почему 10?
Ну, чтение распараллелить вам особо не удастся, а вот процессинг - вполне. Правильный вариант, думаю, читать в одном потоке по частям адекватного размера, и отдавать другим потокам на обработку. И повторять сию процедуру нужное количество раз.
0
13 / 13 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 15:30  [ТС] 17
Короче, предложите, пожалуйста, пример кода... хотя бы для двух потоков.
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 15:41 18
Цитата Сообщение от Setplus Посмотреть сообщение
Короче, предложите, пожалуйста, пример кода... хотя бы для двух потоков.
на тебе, сразу на 10.
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
 void MultiThreadBegin()
        {
            string[] files = new string[10];    // имена файлов
            files[0] = "1.txt";
            files[1] = "2.txt";
            files[2] = "3.txt";
            files[3] = "4.txt";
            files[4] = "5.txt";
            files[5] = "6.txt";
            files[6] = "7.txt";
            files[7] = "8.txt";
            files[8] = "9.txt";
            files[9] = "10.txt";
            BackgroundWorker[] workers = new BackgroundWorker[10];
            BackgroundWorker w;
            for (int i = 0; i < workers.Length; i++)
            {
                w = new BackgroundWorker();
                w.DoWork += W_DoWork;               
                w.RunWorkerAsync(files[i]);
                workers[i] = w;
            }
        }
 
        private void W_DoWork(object sender, DoWorkEventArgs e)
        {
            if (!File.Exists((string)e.Argument))
            {
                // файла не существует
                return;
            }
            string str;
            using (StreamReader fs = new StreamReader((string)e.Argument))
            {
                str = fs.ReadLine();
                if (str == null)
                {
                    // файл закончился
                    return;
                }
                if (GreatStringFunction(str))
                {
                   // функция разбирающая строку вернула true
                } 
               else
                {
                   // функция разбирающая строку вернула false
                }
            }
        }
Само-собой, как уже говорилось, многопоточное чтение с одного диска пользы принесёт мало, а мой код надо будет доработать добавив реакцию программы на разные ситуации. В многопоточном приложении это лучше делать событиями (event).

P.S. Написал на BackGroundWorker`ах, т.к. мне на них почему-то больше нравится.
0
.NET C#,ASP.NET MVC
Эксперт .NET
590 / 501 / 225
Регистрация: 16.10.2010
Сообщений: 1,902
15.08.2016, 15:44 19

Не по теме:

aquaMakc, против лома, нет приема:D



Вопрос к знатокам, а если запустить 10 тасков? Эффект будет тот же?
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 15:47 20
Цитата Сообщение от lvlkoo Посмотреть сообщение
Вопрос к знатокам, а если запустить 10 тасков? Эффект будет тот же?
BGW и Task это всё обёртки над Thread.

Добавлено через 1 минуту
Да, кстати, в моём коде объявление массивов лучше вынести за пределы функции. Проверять не на чем сейчас, есть подозрение, что GC может их грохнуть при выходе из функции MultiThreadBegin
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2016, 15:47

Многопоточное чтение строк из файла
нужно реализовать чтение строк из файла и передавать строку в функцию. Но это должно быть в...

Многопоточное чтение - сжатие - запись файла
Здравствуйте. Необходимо выполнить компрессию файла, причем чтение, запись и сжатие должны...

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

Многопоточное чтение больших файлов
Привет всем! Подскажите пожалуйста как реализовать многопоточное чтение файла рамером 1gb и больше...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru