![]() |
|
|
![]()
|
|
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Есть большой файл (около 6Gb) с парами (X,Y). X изменяется монотонно, но не равномерно.
Нужно иметь возможность построить график, иметь возможность выделить кусок (Xmin, Xmax) и рассмотреть его детально. Используется Qt, как делать если все данные помещаются в ОЗУ знаю. |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
Читать данные, сэмплировать/агрегировать в соответствии с какой-нибудь логикой, чтобы на выходе получить всего несколько тысяч отсчетов. Для зума либо пересчитывать все в реальном времени (если будет отнимать разумное время), либо заранее просчитывать с десяток разных уровней детализации (ориентируясь на объем ОЗУ) и в соответствии с уровнем зума выбирать какой из них отображать. Полученные данные уже отправлять на отрисовку.
Это сообщение отредактировал(а) Amp - 14.4.2015, 13:32 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Я бы ещё перегнал бы этот файл в БД (sqlite, например) и добавил бы индекс по X.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| math64 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Была такая идея. Но насколько это ускорит? Как будет выглятеть запрос данных с нужным шагом по X? PS: попросили визуализировать процесс считывания. Оказалось при замене
на
по крайней мере, визуально, времени затрачивается меньше. Это сообщение отредактировал(а) math64 - 23.4.2015, 09:25 |
||||||
|
|||||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Попробовал через sqlite. Объём базы данных - 13G, создаётся долго (использется транзакция - без неё будет ещё дольше).
Запрос на выборку данных
тоже выполняется слишком долго, быстрее выбрать данные из исходного файла. Это сообщение отредактировал(а) math64 - 21.4.2015, 12:52 |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Зачем? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Отбираю отсчёты, комбинируя алгоритмы бинарного поиска и быстрой сортировки:
укладываюсь в 1 секунду, но если в графике есть высокочастотные изменения, он не соответствует эталонному. Отбор точек путем последовательного просмотра всего файла занимает около 2 минут. PS: не в 1 секунду. В первый раз около 70 секунд. Потом файл оказывается в каком-то системном кеше и повторный поиск занимает примерно 0.5 секунды. Это сообщение отредактировал(а) math64 - 28.4.2015, 09:03 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 1 Всего: 459 |
Монотонно возрастает или убывает на всем промежутке? Если так, то можно разбить весь файл на количество интервалов равное числу пикселей графика. На каждом интервале достаточно исследовать первую и последнюю точку. Такой график посчитается за милисекунду. А зум нужно формировать обходя файл и разбивая заново на интервалы. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
После того, как точки отобраны - да, график рисуется за несколько миллсекунд.
Но отбор точек происходит медленно. Степень неравномерности можно увидеть по прилагемому графику 3a.png 1a.png - неравномерность отбора точек при последовательном просмотре графика (около 2 минут), ошибка +/- 0.5 пискеля 2a.png - неравномерность отбора точек при бинарном поиске - 70 секунд первый раз, 0.5 секунды при повторе. Добавлено через 10 минут и 8 секунд Использование file.map() вместо file.seek() и file.read() только замедляет дело. Присоединённый файл ( Кол-во скачиваний: 4 )
screens.zip 90,69 Kb |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Собираюсь сделать так:
При открытии файла отбираются опорные точки, по которым строится график. При зуме сразу строится пиближённый график по опорным точкам и начинаются считываться промежуточные. По мере считывания график перерисовывается. При повторном зуме старое считывание промежуточных точек нужно остановить и начать новое (но некоторые считанные промежуточные точки можно оставить). Детали реализации пока не продуманы. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |