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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Запись повторяющихся данных в файл  (Прочитано 10123 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 07, 2017, 08:17 »

Добрый день

В файл пишутся данные "кадр за кадром". Может запишем всего 1 кадр, но может и 1000 и более. Известно что многие данные "статичны" т.е. одни и те же для всех записываемых кадров. Конечно "писать все и всегда" надежно, а главное - работы меньше (обычно в таких случаях приплетается "преждевременная оптимизация"). Но все же это не есть хорошо. Ну так как бум оптимизировать?

Спасибо
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июль 07, 2017, 11:37 »

Тагами. Каждый фрейм снабжен тагом (типом) "полный фрейм" или "повтор кадра".
Есть более сложный вариант с "хардлинками", когда есть два тага "данные" и "линк". Таг "данные" хнанит после себя кадр. "Линк" ссылается на место в файле, где лежит таг "данные". Так можно будет переиспользовать кадры, записанные ранее (но надо где-то отдельно хранить мапу ид/хэш кадра -> место в файле)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 07, 2017, 12:07 »

Ну "одинаковые кадры" хотя и возможны но редко. А вот те или иные данные (в разных кадрах) повторяются очень часто.
"Линк" ссылается на место в файле, где лежит таг "данные". Так можно будет переиспользовать кадры, записанные ранее
Да, это решает одну задачу - резко сокращает размер файла данных. Но вот скорость загрузки не только не возрастает, а возможно и наоборот, несколько упадет из-за частых seek'ов. А хотелось бы...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Июль 07, 2017, 12:10 »

Ладно, задам вопрос - файл пишется поточно или на момент записи известны все фреймы?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #4 : Июль 07, 2017, 12:17 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 07, 2017, 12:29 »

Ладно, задам вопрос - файл пишется поточно или на момент записи известны все фреймы?
Кадр за кадром, следующий неизвестен. Но для многих данных известно будут ли они меняться (от кадра к кадру) или нет.

Это видеонаблюдение - где на фоне статичной картинки что то мелькает, и можно статичную картинку поксорить с остальными кадрами, а потом пожать черный фон в "пару килобайт"?
(раз в час обновлять с учетом день-ночь; дождь снег молнии правда заспамят)
Ну почему обязательно "видео"? Это пока данные для рендера, до видео еще далеко Улыбающийся Данные обычные (структуры, контейнеры и.т.п.)
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июль 07, 2017, 13:18 »

Но вот скорость загрузки не только не возрастает, а возможно и наоборот, несколько упадет из-за частых seek'ов. А хотелось бы...
Это почему? Ничего она не упадет. Данные кадра нужно читать один раз, а дальше шарить их в памяти, а не сикать и перечитывать.
« Последнее редактирование: Июль 07, 2017, 14:12 от Old » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Июль 10, 2017, 08:18 »

Для начала нужно вообще проверить что это узкое место, сикать с винта. Я с винта "сикал" по гигабайтам данных, загружая мегабайты, работало более чем достаточно(это еще винт не ssd был).
p.s. а то будет экономия на спичках, хитрый кэш в памяти(если вдруг ваш файл в озу не уместиться - хотя сейчас и по 32Гига памяти есть).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июль 10, 2017, 08:38 »

Для начала нужно вообще проверить что это узкое место, сикать с винта. Я с винта "сикал" по гигабайтам данных, загружая мегабайты, работало более чем достаточно(это еще винт не ssd был).
Ой спасибо, кэп, что Вы это объяснили! А то сидим тут, и вот просто от нечего делать выдумываем задачи которые не очень-то и нужны  Улыбающийся
p.s. а то будет экономия на спичках, хитрый кэш в памяти(если вдруг ваш файл в озу не уместиться - хотя сейчас и по 32Гига памяти есть).
Приложение-читатель отслеживает кол-во используемой памяти своими средствами. Если памяти не хватает, то кэши должны быть выброшены и данные должны повторно грузиться с диска (хотя это и медленнее)

Данные НЕ константны, после загрузки они могут меняться всяко-разно (хотя загружалось одно и то же).
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Июль 10, 2017, 09:17 »

Ой спасибо, кэп, что Вы это объяснили! А то сидим тут, и вот просто от нечего делать выдумываем задачи которые не очень-то и нужны  Улыбающийся
Я написал исходя из этого:
Да, это решает одну задачу - резко сокращает размер файла данных. Но вот скорость загрузки не только не возрастает, а возможно и наоборот, несколько упадет из-за частых seek'ов. А хотелось бы...
То что скорость рендомного доступа раз так в 100 ниже для обычного HDD и так понятна, но может у вас будут редко промахи мимо кэша винта. Протестить для начала неплохо бы, а то я тоже пару раз занимался оптимизацией, а потом понял что сэкономил на спичках.
Если ваших данных меньше чем кеш винта - забить на оптимизацию, линукс кэширует винт(и ваших данных меньше свободного озу) - аналогично.
Ваши данные влезают в ОЗУ - загрузить все в ОЗУ.
Ваши данные не влезают в ОЗУ, а вот тут можно пообсуждать и немного подумать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июль 10, 2017, 09:58 »

То что скорость рендомного доступа раз так в 100 ниже для обычного HDD и так понятна, но может у вас будут редко промахи мимо кэша винта. Протестить для начала неплохо бы, а то я тоже пару раз занимался оптимизацией, а потом понял что сэкономил на спичках.
Если ваших данных меньше чем кеш винта - забить на оптимизацию, линукс кэширует винт(и ваших данных меньше свободного озу) - аналогично.
Ваши данные влезают в ОЗУ - загрузить все в ОЗУ.
Ваши данные не влезают в ОЗУ, а вот тут можно пообсуждать и немного подумать.
Типичная ситуация - вроде бы ответ разумен, но... ничего кроме раздражения у ТС он не вызывает Улыбающийся Потому что вместо того чтобы "как решать задачу" Вы начинаете обсуждать "а нужно ли ее решать?". Разумеется сразу же требуются (многочисленные) технические подробности, разговор уходит в сторону и затухает. Рез-т? Ноль.

Так вот, давайте примем без всяких доказательств что задачу решать НАДО. Возможно Вы в 100 раз умнее меня, но свою задачу я знаю в 100 раз лучше, поэтому мне виднее. И вот что
Если ваших данных меньше ..
Ваши данные влезают ..
Ваши данные не влезают ...
А почему Вы думаете что (примерный) объем данных известен? Для порядочных задач это обычно не так, и способность приложения обрабатывать большие объемы данных (пусть и медленнее) и является "показателем класса". А то тупенько вылететь по std::bad_alloc всякий может.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Июль 10, 2017, 17:03 »

Если ваших данных меньше чем кеш винта - забить на оптимизацию, линукс кэширует винт(и ваших данных меньше свободного озу) - аналогично.
Ваши данные влезают в ОЗУ - загрузить все в ОЗУ.
Ваши данные не влезают в ОЗУ, а вот тут можно пообсуждать и немного подумать.

Я бы был ооочень осторожен в таких высказываниях Улыбающийся

Есть один маленький противный нюанс: никто заранее не знает, сколько ОЗУ на целевой машине, какой винт, какая ось, ну и еще там фиг знает, какие условия.

Поэтому "забить" - это для студенческого проекта можно, а вот для чего-либо более серьезного уже не прокатит Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Июль 10, 2017, 17:56 »

Так вот, давайте примем без всяких доказательств что задачу решать НАДО. Возможно Вы в 100 раз умнее меня, но свою задачу я знаю в 100 раз лучше, поэтому мне виднее. И вот что


Ну так чем два предложенных решения не устраивают?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #13 : Июль 11, 2017, 08:34 »

Поэтому "забить" - это для студенческого проекта можно, а вот для чего-либо более серьезного уже не прокатит Улыбающийся
Или для прототипа. Если это не древний хлам то у винта кэш от 32Мб(и скорее всего винт ssd), и озу >4Gb.
Можно еще системные требования написать.

Мы то не знаем объемы данных, может это пару метров(на которые можно положить seek) , а может и эксабайты (где QMap уже не поможет и придется БД использовать или еще что более хитрое).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июль 11, 2017, 10:53 »

Ну так чем два предложенных решения не устраивают?
Сказать что-то в тему - еще не решение

Есть один маленький противный нюанс: никто заранее не знает, сколько ОЗУ на целевой машине, какой винт, какая ось, ну и еще там фиг знает, какие условия.

Поэтому "забить" - это для студенческого проекта можно, а вот для чего-либо более серьезного уже не прокатит Улыбающийся
Вот, товарищ понимает. Добавлю что часто только такими "маленькими подробностями" и отличается профессиональный софт от бесплатного.

Если это не древний хлам ..
Опять гоняем порожняк - винт, озу (шмотье, музон)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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