Russian Qt Forum
Ноябрь 23, 2024, 05:01
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Алгоритмы
>
Задачка на производительность
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Задачка на производительность (Прочитано 22728 раз)
once_again_abc
Гость
Задачка на производительность
«
:
Февраль 21, 2012, 09:00 »
есть некий генератор массивного потока данных (примерно 8МБ/сек.).
программа считывает эти данные из сети. необходимо сделать следующее:
1. записать _все_ полученные данные (с несложной предварительной обработкой) на диск;
2. обработать актуальные данные несколькими разными способами для разного графического представления в реальном времени (т.е. пришли данные - фильтры - отображение актуальной информации и т.д.).
т.е. здесь две противоречивые по требованиям задачи. как вы думаете, какой подход будет наиболее эффективным для реализации этих двух задач? меня интересуют алгоритмы/принципы решения.
сделать один кольцевой буфер с одним писателем и N читателями? или создать отдельные буфера для каждой из задач? или один кольцевой буфер для записи в файл и несколько буферов на каждое отображение?
понятно, что графики в реальном времени целостность всех данных не важна - что успеваем то и отображаем, если скажем накопилась значительная задержка (например пол секунды или 100 миллисекунд) - сбрасываем буфера и берем самые свежие данные - полученные только что.
для файла же наоборот, важна запись именно всех данных, без потерь.
Записан
Bepec
Гость
Re: Задачка на производительность
«
Ответ #1 :
Февраль 21, 2012, 09:06 »
Вопрос многопоточности стоит? Или у вас всё будет однопоточно?
По идее задачка интересная, только нет моментов - какие фильтры, какие данные, какая обработка. (я и при 115200 скорости могу на пять минут обработку сделать
)
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Задачка на производительность
«
Ответ #2 :
Февраль 21, 2012, 10:19 »
По-моему здесь простейшая схема: одна нитка читает и помещает новые задачи в контейнер. N др ниток извлекают задачи из контейнера. Помещение/извлечение защищены локом - вся любовь
Записан
once_again_abc
Гость
Re: Задачка на производительность
«
Ответ #3 :
Февраль 21, 2012, 23:52 »
Цитата: Bepec от Февраль 21, 2012, 09:06
Вопрос многопоточности стоит? Или у вас всё будет однопоточно?
По идее задачка интересная, только нет моментов - какие фильтры, какие данные, какая обработка. (я и при 115200 скорости могу на пять минут обработку сделать
)
ничего особенного. спектральный анализ на FFT, усреднение, простые алгебраические операции над массивом float. т.е. не на 5 минут =) ну может быть миллисекунд 50 на 4х ядерном в несколько потоков. вообще я думаю это неважно для данной задачи... 50 мс. или 5 минут.
Записан
once_again_abc
Гость
Re: Задачка на производительность
«
Ответ #4 :
Февраль 21, 2012, 23:57 »
Цитата: Igors от Февраль 21, 2012, 10:19
По-моему здесь простейшая схема: одна нитка читает и помещает новые задачи в контейнер. N др ниток извлекают задачи из контейнера. Помещение/извлечение защищены локом - вся любовь
что имеется ввиду под задачами и контейнером?
Записан
Bepec
Гость
Re: Задачка на производительность
«
Ответ #5 :
Февраль 22, 2012, 06:54 »
Что приём новых данных идёт в буфер (контейнер). Если контейнер переполняется, она его чистит. Это первая нитка.
Вторая нитка берёт из буфера даные и обрабатывает. Результат скидывает куда - то
Записан
once_again_abc
Гость
Re: Задачка на производительность
«
Ответ #6 :
Февраль 22, 2012, 07:40 »
Цитата: Bepec от Февраль 22, 2012, 06:54
Что приём новых данных идёт в буфер (контейнер). Если контейнер переполняется, она его чистит. Это первая нитка.
Вторая нитка берёт из буфера даные и обрабатывает. Результат скидывает куда - то
а мне кажется, что такое решение не подходит. и вот почему. фактически есть два потребителя данных: запись в файл для которого не допустима ситуация переполнения контейнер (по определению задачи) и обработка данных с графикой - для которой потеря устаревших данных абсолютно пофигу. время обрадотки данных для этих двух потребителей очевидно недетерменировано. при этом запись в файл может занять дольше времени чем графическая обработка и наоборот. т.о. как минимум для файлового потребителя необходимо организовывать свой кольцевой буфер или бесконечный список (но тогда фрагментация памяти и падение производительности системы)... в общем думаю пока что делать. в лоб такую штуку врядли решишь эффективно.
Записан
Bepec
Гость
Re: Задачка на производительность
«
Ответ #7 :
Февраль 22, 2012, 07:58 »
Эммм... Чистить - это и есть сброс в файл/поток обработки/память/другой контейнер.
И потребитель данных - один. Это поток обработки.
Можно вообще пойти по пути упрощения - обновлять информацию на графике раз в 200-300 мс. Человеческий глаз не заметит разницы, зато в разы уменьшается время на обработку и прочая.
Записан
once_again_abc
Гость
Re: Задачка на производительность
«
Ответ #8 :
Февраль 22, 2012, 08:19 »
Цитата: Bepec от Февраль 22, 2012, 07:58
Эммм... Чистить - это и есть сброс в файл/поток обработки/память/другой контейнер.
И потребитель данных - один. Это поток обработки.
Можно вообще пойти по пути упрощения - обновлять информацию на графике раз в 200-300 мс. Человеческий глаз не заметит разницы, зато в разы уменьшается время на обработку и прочая.
данные идут неприрывно со скоростью 8 МБ/сек. что делать с данными, которые пришли во время сброса заполненного буфера в файл? копировать в другой буфер? тогда это и есть кусочный кольцевой буфер...
оффтоп: 200-300 мс. на графике очень хорошо заметно по дерганьям картинки =) идеально для меня 20 мс. есть к чему стремиться =)
Записан
Bepec
Гость
Re: Задачка на производительность
«
Ответ #9 :
Февраль 22, 2012, 08:24 »
Сбрасывать можно спокойно и в отдельном потоке
А то, что пришло в тот момент опять таки будет попадать в буфер.
Долго можно филосовствовать. С таким подходом вам нужно 3-4 буфера.
1 - приём
2 - данные на обработку
3 - данные для сброса в файл
4 - ?
Записан
once_again_abc
Гость
Re: Задачка на производительность
«
Ответ #10 :
Февраль 22, 2012, 08:28 »
Цитата: Bepec от Февраль 22, 2012, 08:24
Сбрасывать можно спокойно и в отдельном потоке
А то, что пришло в тот момент опять таки будет попадать в буфер.
Долго можно филосовствовать. С таким подходом вам нужно 3-4 буфера.
1 - приём
2 - данные на обработку
3 - данные для сброса в файл
4 - ?
4. Профит!!!!111
буду експерементировать.
Записан
Akon
Гость
Re: Задачка на производительность
«
Ответ #11 :
Февраль 22, 2012, 11:58 »
Единый кольцевой буфер на всех потребителей. Голова для всех потребителей одна, хвост у каждого свой. Ячейка в буфере помечается свободной, когда обработана всеми потребителями. Размер буфера выбирается исходя из того, чтобы не допустить потерю записи в файл. Отрисовка данных может быть реальным тормозом, поскольку выполняется из GUI потока, поэтому необходимая порция самых свежих данных копируется из буфера.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Задачка на производительность
«
Ответ #12 :
Февраль 22, 2012, 13:02 »
FFT (да и практически любая обработка) требует фиксированного кол-ва точек сигнала. Поэтому возникает единица (chunk) данных. Читающий должен прочитать N измерений в буфер. Когда все N прочитаны этот буфер помещается в контейнер буферов. А с контейнером уже как хотите так и крутите - сливаете в файл, рисуете, пропускаете куски и.т.п.
Записан
Akon
Гость
Re: Задачка на производительность
«
Ответ #13 :
Февраль 22, 2012, 14:00 »
У разных потребителей разные чанки.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Задачка на производительность
«
Ответ #14 :
Февраль 22, 2012, 14:48 »
Цитата: Akon от Февраль 22, 2012, 14:00
У разных потребителей разные чанки.
Входные - одни и те же. А как потребитель их использует (или во что конвертирует) = его личное дело
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...