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

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

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

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

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

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

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

37
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 15:50
Студворк — интернет-сервис помощи студентам
не, накосячил, ща...
0
15.08.2016, 15:50

Не по теме:

Цитата Сообщение от lvlkoo Посмотреть сообщение
Вопрос к знатокам, а если запустить 10 тасков? Эффект будет тот же?
На двухядерном проце - да :)
Цитата Сообщение от aquaMakc Посмотреть сообщение
GC может их грохнуть при выходе из функции MultiThreadBegin
Дык, ему ж можно указать KeepAlive :)

0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 15:53
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  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))
            {
                while ((str = fs.ReadLine()) != null)
                {
                    if (GreatStringFunction(str))
                    {
                        // функция разбирающая строку вернула true
                    }
                    else
                    {
                        // функция разбирающая строку вернула false
                    }
                }
            }
        }
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Cupko Посмотреть сообщение
Дык, ему ж можно указать KeepAlive
Проще объявить снаружи функции.

1
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 16:00  [ТС]
aquaMakc, спасибо большое, но, конечно, я ждал, что будет решение либо с Task, либо Parallel.For..
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 16:01
Цитата Сообщение от Setplus Посмотреть сообщение
решение либо с Task, либо Parallel.For..
) в условии задачи этого не было
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
15.08.2016, 16:10
Setplus,
C#
1
2
3
4
5
6
7
8
9
10
11
List<Task> tasks = new List<Task>() 
{
    new Task(() => {ReadFileMethod(...);}), 
    new Task(() => {ReadFileMethod(...);}),
    ....
}
 
foreach (var task in tasks)
{
    task.Start();
}
Мб как то так
1
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 17:19  [ТС]
Во, это уже интересно, спасибо.

Добавлено через 1 час 7 минут
Столкнулся с некоторой проблемой и не знаю, от чего она:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 int k2 = 0,k3 = 0;
            List<Task> tasks = new List<Task>()
            {
                new Task(() => 
                    {
                        foreach (string str in File.ReadAllLines(@"C:\2.txt"))
                            k2++;
                        if (k2 == 1000)
                            Console.WriteLine("Первая таска закончила свою работу");
                    }),
                new Task(() => 
                {
                    foreach (string str in File.ReadAllLines(@"C:\3.txt"))
                        k3++;
                    if (k3 == 1000)
                        Console.WriteLine("Вторая таска закончила свою работу");
                })
            };
            foreach (var task in tasks)
                task.Start();
Программа сразу завершается, ничего не напечатав даже.. В чём проблема?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 17:26
Цитата Сообщение от Setplus Посмотреть сообщение
Программа сразу завершается, ничего не напечатав даже.. В чём проблема?
))) в конце своей программы
C#
1
Console.ReadKey();
поставь.
0
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 17:28  [ТС]
aquaMakc, ставил: просто ждёт, пока я нажму кнопку..
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
15.08.2016, 17:30
Цитата Сообщение от Setplus Посмотреть сообщение
C#
1
foreach (string str in File.ReadAllLines(@"C:\2.txt")) k2++;
Здесь ты до упора перебираешь строки и инкрементируешь k2.
Цитата Сообщение от Setplus Посмотреть сообщение
C#
1
if (k2 == 1000) Console.WriteLine("Первая таска закончила свою работу");
А здесь проверяешь значение k2 после прохождения по всем строкам.
1
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 17:34  [ТС]
aquaMakc, ой,лооол..Спасибо.
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
15.08.2016, 17:42
Видимо условие никогда не выполняется,
C#
1
2
if (k2 == 1000)
    Console.WriteLine("Первая таска закончила свою работу");
Добавлено через 47 секунд
Ну собственно говоря ответили выше

Добавлено через 3 минуты
Кстати, еще вы можете использовать Task.Run(). Задача запускается сразу, без вызова Task.Start();

C#
1
2
3
Task.Run( () => { /*Great file work1*/ })
Task.Run( () => { /*Great file work2*/ })
...
1
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 17:53  [ТС]
lvlkoo, О, отлично. Спасибо)
0
Заблокирован
15.08.2016, 19:40
C#
1
2
3
 Parallel.For(0, 10, index => {
                File.ReadAllText(@"myPath" + index + ".txt");
            });
0
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
15.08.2016, 22:12  [ТС]
Dsasdf, хорошее решение, но хотелось бы увидеть какой-нибудь механизм синхронизации.
0
Эксперт .NET
 Аватар для Rius
13391 / 7846 / 1699
Регистрация: 25.05.2015
Сообщений: 23,855
Записей в блоге: 14
15.08.2016, 22:28
Setplus, синхронизации чего и с чем?
C#
1
2
3
4
5
6
7
string test = "str";
 
var files = Enumerable.Range(1, 4).Select(x => String.Format("{0}.txt", x));
 
var selectedFiles = files.AsParallel()
    .Where(file => File.ReadLines(file).Any(str => str == test))
    .ToList();
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
16.08.2016, 08:27
Setplus,
1) Работать с диском в несколько потоков бессмысленно и вредно. Диск (HDD или SSD, не важно) - однопоточное устройство. В один момент может читаться только один файл. Поэтому городить кучу потоков - совершенно нет смысла, кроме как убить производительность.

2) Для поиска информации, как вы пытаетесь это сделать, используется процесс, который называется индексация. Суть в том, что все файлы заранее считываются, и для них генерируется индекс(указатель, оглавление, словарь), который может содержать например хеш-код строки, индексы расположения строк в файле и другую вспомогательную информацию (зависит от структуры ваших данных). Индекс сортируется для более быстрого поиска в нем. Далее, вся индексная информация записывается в отдельный индексный файл. При поиске конкретной строки, сначала читается индексный файл в память (его размер обычно намного меньше размера самих файлов), затем строка ищется в индексном массиве (по хешу например. с учетом того, что индекс отсортирован это займет O(log n), то есть очень быстро). Далее, из индекса считывается информация о расположении необходимых данных в файлах и тогда уже читаются данные из ваших текстовых файлов. И не вся подряд, а в определенных местах, куда указывает индекс. И уже в файлах происходит окончательный поиск данных. Именно так работают СУБД.
Это может показаться сложным, но по другому с большими данными работать не получится. Читать десятки гигабайтных файлов, в куче потоков - совершенно тупое, экстенсивное решение.

3) Возможно имеет смысл использовать СУБД, потому что там индексация уже идет из коробки, ничего выдумывать не нужно.
5
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
16.08.2016, 10:00  [ТС]
Storm23, спасибо, довольно полезная информация!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.08.2016, 10:00

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru