Russian Qt Forum
Май 15, 2024, 06:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Задачка на производительность  (Прочитано 22067 раз)
once_again_abc
Гость
« : Февраль 21, 2012, 09:00 »

есть некий генератор массивного потока данных (примерно 8МБ/сек.).
программа считывает эти данные из сети. необходимо сделать следующее:

1. записать _все_ полученные данные (с несложной предварительной обработкой) на диск;
2. обработать актуальные данные несколькими разными способами для разного графического представления в реальном времени (т.е. пришли данные - фильтры - отображение актуальной информации и т.д.).

т.е. здесь две противоречивые по требованиям задачи. как вы думаете, какой подход будет наиболее эффективным для реализации этих двух задач? меня интересуют алгоритмы/принципы решения.
сделать один кольцевой буфер с одним писателем и N читателями? или создать отдельные буфера для каждой из задач? или один кольцевой буфер для записи в файл и несколько буферов на каждое отображение?

понятно, что графики в реальном времени целостность всех данных не важна - что успеваем то и отображаем, если скажем накопилась значительная задержка (например пол секунды или 100 миллисекунд) - сбрасываем буфера и берем самые свежие данные - полученные только что.
для файла же наоборот, важна запись именно всех данных, без потерь.
Записан
Bepec
Гость
« Ответ #1 : Февраль 21, 2012, 09:06 »

Вопрос многопоточности стоит? Или у вас всё будет однопоточно?

По идее задачка интересная, только нет моментов - какие фильтры, какие данные, какая обработка. (я и при 115200 скорости могу на пять минут обработку сделать Подмигивающий )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 21, 2012, 10:19 »

По-моему здесь простейшая схема: одна нитка читает и помещает новые задачи в контейнер. N др ниток извлекают задачи из контейнера. Помещение/извлечение защищены локом - вся любовь
Записан
once_again_abc
Гость
« Ответ #3 : Февраль 21, 2012, 23:52 »

Вопрос многопоточности стоит? Или у вас всё будет однопоточно?

По идее задачка интересная, только нет моментов - какие фильтры, какие данные, какая обработка. (я и при 115200 скорости могу на пять минут обработку сделать Подмигивающий )

ничего особенного. спектральный анализ на FFT, усреднение, простые алгебраические операции над массивом float. т.е. не на 5 минут =) ну может быть миллисекунд 50 на 4х ядерном в несколько потоков. вообще я думаю это неважно для данной задачи... 50 мс. или 5 минут.
Записан
once_again_abc
Гость
« Ответ #4 : Февраль 21, 2012, 23:57 »

По-моему здесь простейшая схема: одна нитка читает и помещает новые задачи в контейнер. N др ниток извлекают задачи из контейнера. Помещение/извлечение защищены локом - вся любовь

что имеется ввиду под задачами и контейнером?
Записан
Bepec
Гость
« Ответ #5 : Февраль 22, 2012, 06:54 »

Что приём новых данных идёт в буфер (контейнер). Если контейнер переполняется, она его чистит. Это первая нитка.
Вторая нитка берёт из буфера даные и обрабатывает. Результат скидывает куда - то Подмигивающий
Записан
once_again_abc
Гость
« Ответ #6 : Февраль 22, 2012, 07:40 »

Что приём новых данных идёт в буфер (контейнер). Если контейнер переполняется, она его чистит. Это первая нитка.
Вторая нитка берёт из буфера даные и обрабатывает. Результат скидывает куда - то Подмигивающий

а мне кажется, что такое решение не подходит. и вот почему. фактически есть два потребителя данных: запись в файл для которого не допустима ситуация переполнения контейнер (по определению задачи) и обработка данных с графикой - для которой потеря устаревших данных абсолютно пофигу. время обрадотки данных для этих двух потребителей очевидно недетерменировано. при этом запись в файл может занять дольше времени чем графическая обработка и наоборот. т.о. как минимум для файлового потребителя необходимо организовывать свой кольцевой буфер или бесконечный список (но тогда фрагментация памяти и падение производительности системы)... в общем думаю пока что делать. в лоб такую штуку врядли решишь эффективно.
Записан
Bepec
Гость
« Ответ #7 : Февраль 22, 2012, 07:58 »

Эммм... Чистить - это и есть сброс в файл/поток обработки/память/другой контейнер.
И потребитель данных - один. Это поток обработки.

Можно вообще пойти по пути упрощения - обновлять информацию на графике раз в 200-300 мс. Человеческий глаз не заметит разницы, зато в разы уменьшается время на обработку и прочая.

Записан
once_again_abc
Гость
« Ответ #8 : Февраль 22, 2012, 08:19 »

Эммм... Чистить - это и есть сброс в файл/поток обработки/память/другой контейнер.
И потребитель данных - один. Это поток обработки.

Можно вообще пойти по пути упрощения - обновлять информацию на графике раз в 200-300 мс. Человеческий глаз не заметит разницы, зато в разы уменьшается время на обработку и прочая.



данные идут неприрывно со скоростью 8 МБ/сек. что делать с данными, которые пришли во время сброса заполненного буфера в файл? копировать в другой буфер? тогда это и есть кусочный кольцевой буфер...

оффтоп: 200-300 мс. на графике очень хорошо заметно по дерганьям картинки =) идеально для меня 20 мс. есть к чему стремиться =)
Записан
Bepec
Гость
« Ответ #9 : Февраль 22, 2012, 08:24 »

Сбрасывать можно спокойно и в отдельном потоке Подмигивающий А то, что пришло в тот момент опять таки будет попадать в буфер.
Долго можно филосовствовать. С таким подходом вам нужно 3-4 буфера.
1 - приём
2 - данные на обработку
3 - данные для сброса в файл
4 - ?
Записан
once_again_abc
Гость
« Ответ #10 : Февраль 22, 2012, 08:28 »

Сбрасывать можно спокойно и в отдельном потоке Подмигивающий А то, что пришло в тот момент опять таки будет попадать в буфер.
Долго можно филосовствовать. С таким подходом вам нужно 3-4 буфера.
1 - приём
2 - данные на обработку
3 - данные для сброса в файл
4 - ?

4. Профит!!!!111

 Смеющийся

буду експерементировать.
Записан
Akon
Гость
« Ответ #11 : Февраль 22, 2012, 11:58 »

Единый кольцевой буфер на всех потребителей. Голова для всех потребителей одна, хвост у каждого свой. Ячейка в буфере помечается свободной, когда обработана всеми потребителями. Размер буфера выбирается исходя из того, чтобы не допустить потерю записи в файл. Отрисовка данных может быть реальным тормозом, поскольку выполняется из GUI потока, поэтому необходимая порция самых свежих данных копируется из буфера.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Февраль 22, 2012, 13:02 »

FFT (да и практически любая обработка) требует фиксированного кол-ва точек сигнала. Поэтому возникает единица (chunk) данных. Читающий должен прочитать N измерений в буфер. Когда все N прочитаны этот буфер помещается в контейнер буферов. А с контейнером уже как хотите так и крутите - сливаете в файл, рисуете, пропускаете куски и.т.п.
Записан
Akon
Гость
« Ответ #13 : Февраль 22, 2012, 14:00 »

У разных потребителей разные чанки.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Февраль 22, 2012, 14:48 »

У разных потребителей разные чанки.
Входные - одни и те же. А как потребитель их использует (или во что конвертирует) = его личное дело
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.158 секунд. Запросов: 22.