0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 13
1
.NET 3.x

Многопоточная обработка данных + ввод/вывод

16.08.2015, 23:07. Показов 1837. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Пишу небольшое консольное приложение, и у меня возникли некоторые вопросы. Надеюсь, кто-нибудь мне поможет.

Суть приложения в следующем. Нужно организовать многопоточное сжатие файла большого размера (превышающего размер RAM). И использовать нужно .NET версии не выше 3.5 (соответственно никаких классов Task, Parallel и т.д.)

Я решил в этом деле применить шаблон поставщик/потребитель. Создаем несколько рабочих потоков, по одному на каждое ядро процессора (или число потоков следует выбирать иначе?). Основной поток считывает входной файл по блокам, и раздает их рабочим потокам, которые возвращают сжатые блоки для записи. На словах все достаточно просто. Но при реализации возникли следующие вопросы.

1. Как правильно реализовать очередь из блоков? Это может быть одна очередь, либо же отдельная очередь на каждый поток (лично я считаю последний вариант более оптимальным).
2. На блоки какого размера следует разбивать файл? Хотя этот вопрос не очень насущный, потому как это легко можно определить тестами.
3. Нумерация блоков. Так как в сжатый файл блоки нужно поместить в том же порядке, в котором они были считаны их исходного файла, то их необходимо нумеровать. Хорошо. Записали пронумерованные блоки в очередь (или в очереди), откуда их будет извлекать записывающий поток. Тут-то и проблема. Учитывая, что запись и так самое узкое место, записывающему потоку еще придется выискивать нужные блоки для организации правильного порядка записи. А если какой-то из блоков запоздает, то совсем плохая картина получается. И, собственно, сам вопрос: Как быть?
4. И, пожалуй, самый трудный вопрос. Как правильно организовать подачу этих самых блоков? Чтобы очередь на запись не переполнялась, а очередь на сжатие никогда не оставалась пустой.
5. И, наконец, как нужно выбирать размер памяти, отведенный приложению? Как это делаю нормальные программисты? Или без зазрения совести занимать всю свободную?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2015, 23:07
Ответы с готовыми решениями:

Многопоточная обработка
Здравствуйте! Есть while, который берет записи из базы данных и обрабатывает их с помощью методов...

Многопоточная обработка мелких файлов
Добрый день! Программа через ThreadPool обрабатывает массив файлов: foreach (string file...

Многопоточная обработка большого массива через ThreadPool с возможностью остановки
Добрый день! Возникла такая задача. В массиве 200 тыс. строк. Их нужно обработать с помощью...

Как завершить ввод-вывод данных с COM-порта
WinForm - приложение. Модему через ком-порт посылаются AT - команды. Через DataReceived принимаются...

2
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
16.08.2015, 23:30 2
eg__13, примерное вИдение решения, исходя из требований.
1. Создаем объект для хранения сжатых данных, с обязательным наличие ключа.
2. Запускаем чтение файла, после чтения N количества данных стартуем первый поток обработки. И так по кругу, в несколько потоков.
3. Если свободных поток нет, ждем когда появится первый свободный и ему скармливаем очередную порцию.
4. Создаем глобальный счетчик, лучше volatile, и в каждом потоке обработки после обработки очередного блока устанавливаем наш ключ объекта хранения (этим счетчиком) и увеличиваем его на 1.
5. Записываем наш блок в хранилище блоков сжатых данных (словарь или что-то подобное).
6. После окончания сжатия сортируем получившееся хранилище по ключу, и в итоге мы получим все блоки в том порядке, в каком они были сжаты.
Вот примерный алгоритм, как я его вижу.
Что касается
Цитата Сообщение от eg__13 Посмотреть сообщение
как нужно выбирать размер памяти, отведенный приложению?
Думаю, это можно оставить на усмотрение CLR.
1
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
21.08.2015, 23:01 3
Цитата Сообщение от eg__13 Посмотреть сообщение
многопоточное сжатие файла большого размера (превышающего размер RAM)
Начать следует с грамотного (строчного, блочного и\или многопоточного) прочтения огромадного файла.
Остальное приложиться - потоки, очереди, сжатие - исходников до кучи.
0
21.08.2015, 23:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2015, 23:01
Помогаю со студенческими работами здесь

Многопоточная работа с БД, отправка данных, обновление. Есть ли готовые решения?
Поток "1" читает данные, другие потоки берут из потока "1" и что-то делают. Если по какой-то...

Многопоточная реализация обработки данных и обращения к БД
Есть примерно такой алгоритм: 1. Считываем данные из файла 2. Ищем в словаре запись, если нет...

Ввод и вывод данных из коллекции
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using...

Многопоточная обработка структур
Прошу сильно не ругать. Нужна помощь со студенческим заданием. Задание такое: В работе необходимо...


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

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

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