Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,165
1

Подскажите паттерн для задачи (многопоточное чтение и обработка файлов)

19.10.2016, 17:28. Показов 1906. Ответов 9
Метки нет (Все метки)

Добрый день!

Есть следующая задача. Нужно делать многопоточную программу. 2 потока читают данные с винчестера и готовят списки данных (List<string>). По мере готовности они "скармливают" эти списки остальным потокам, которые их обрабатывают (делают парсинг данных), записывая результаты в общий datagridview.

Мне нужно реализовать таким образом, чтобы:

1) был минимальный простой всех потоков (загрузка 100%);

2) не было переполнения оперативной памяти. Например, если в памяти уже много необработанных списков (> 1 Гб), тогда нужно временно переключить читающие с диска потоки - на обработку списков.

Подскажите, есть ли готовые паттерны для подобной обработки данных? Заранее благодарен. Использую .NET Framework 4.0.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2016, 17:28
Ответы с готовыми решениями:

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

Многопоточное чтение больших файлов
Доброго времени суток! Нужен совет. Имеется, скажем, 10 текстовых файлов 1.txt;2.txt и т.д. и...

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

Какой паттерн/паттерны юзать для реализации задачи?
Есть задача: «Заводы по производству автомобилей» где должно быть реализовано создание автомобилей...

9
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.10.2016, 17:44 2
Цитата Сообщение от Suppir Посмотреть сообщение
2 потока читают данные с винчестера
Пусть я буду первым, кто скажет, что многопоточное чтение файлов и одного диска - глупая идея.
0
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,165
19.10.2016, 17:58  [ТС] 3
aquaMakc,

Почему же? Если поток, который читает файлы в массивы, делает еще некоторые операции (пропускает комментарии, отделяет команды) - то многопоточное вычисление дает преимущество. По крайней мере, на моем SSD разницу заметно сильно.
0
Эксперт .NET
7788 / 5252 / 1251
Регистрация: 25.05.2015
Сообщений: 16,019
Записей в блоге: 14
19.10.2016, 17:59 4
Цитата Сообщение от Suppir Посмотреть сообщение
По крайней мере, на моем SSD разницу заметно сильно.
У SSD нет подвижных частей.
Не у всех есть SSD.
0
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,165
19.10.2016, 18:01  [ТС] 5
Сейчас проверил:

многопоток - 151 Мб/сек
один поток - 55 Мб/сек

i7, SSD.

Добавлено через 53 секунды
Цитата Сообщение от Rius Посмотреть сообщение
У SSD нет подвижных частей.
Не у всех есть SSD.
По моей специфике работы программу будут использовать на мощных ПК (i5 - i7, SSD). Поэтому многопоточная обработка очень важна.
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.10.2016, 18:04 6
Suppir, на SSD может и будет заметно, в силу общего преимущества в скоростях чтения/записи по сравнению с HDD, а если ещё и контроллер умеет в несколько потоков, так вообще замечательно. Но в постановке задачи этого момента не было )

Добавлено через 1 минуту
Цитата Сообщение от Suppir Посмотреть сообщение
не было переполнения оперативной памяти
Может имеет смысл не буферизировать прочитанные данные, а обрабатывать их в поточном режиме?
0
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,165
19.10.2016, 18:08  [ТС] 7
aquaMakc, понятно

нужен именно многопоток. То есть, имеем 8 логических ядер. 2 ядра читают с диска/ssd и делают первичное формирование списков. А остальные потоки - обрабатывают данные списки.

Если происходит переполнение памяти (слишком большая очередь необработанных списков), тогда переключать все потоки - на обработку списков.

Если же очередь очень маленькая (часть ядер простаивает) - тогда увеличить количество потоков, которые читают с диска.

В идеале - должна быть 100% загрузка процессора все время работы программы.

Добавлено через 2 минуты
Цитата Сообщение от aquaMakc Посмотреть сообщение
Может имеет смысл не буферизировать прочитанные данные, а обрабатывать их в поточном режиме?
Сейчас программа работает следующим образом:

в многопоточном режиме происходит построчное чтение файлов, а при чтении - сразу происходит обработка парсером. НО получается, что 1 файл обрабатывается 1 ядром процессора. При этом скорость падает, если ядер много, а файлов мало (часть ядер простаивают). Или если файлы сильно разного размера. Также скорость падает, если чтение файлов идет по сети или с медленного винчестера (рассматриваем и такой сценарий, хотя он редкий). Хотелось бы лучше распределить задачи (часть ядер - читают файлы, формируя "очередь задач", а остальные ядра - берут эти списки из очереди и занимаются их обработкой).
0
972 / 867 / 349
Регистрация: 26.04.2012
Сообщений: 2,647
19.10.2016, 18:33 8
Suppir, если не брать во внимание все описанное выше про многопоточное чтение c диска, то я бы реализовал это как Producer-Consumer (на русском StackOvererflow по первой же ссылке из гугла показана реализация). Есть и специальный класс для этого дела-BlockingCollection.
2
26 / 26 / 11
Регистрация: 08.08.2011
Сообщений: 1,165
19.10.2016, 19:34  [ТС] 9
EvilFromHell, спасибо, попробую реализовать.
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
20.10.2016, 09:23 10
EvilFromHell, за упоминание BlockingCollection спасибо. Не дочитал описание System.Collections.Concurrent до этого момента и строил велосипед.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2016, 09:23

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

Чтение и обработка файлов CSV
Доброго времени суток всем. Посмотрите пожалуйста задание. Разработать статистическую библиотеку...

Чтение и обработка больших файлов
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на int'ы и посчитать...

Чтение и обработка текстовых файлов
Имеется текстовый файл, содержащий строки, первые символы которых обозначают различные типы данных...

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

Подскажите какой паттерн использовать для запоминания расположения категории товара
Товар может находиться в подкатегории например, техника/цифровая техника/фотоаппараты - вложенность...


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

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

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