Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2022, 19:04   #1
andrey2185
Новичок
Джуниор
 
Регистрация: 22.09.2022
Сообщений: 4
По умолчанию Как создать эффективный механизм кэширования

Здравствуйте!

Занимаюсь вычислениями, пишу программу. Этапы вычислений в программе будут представлены объектами, которые содержат: ссылки на источники данных (такие же объекты), функцию, выполняемую над входящими данными, и вектор с результатами вычислений, они же входящие данные для других этапов вычислений (кэш с промежуточными результатами).

Промежуточные результаты вычислений представлены векторами int32, float32 и bool. Эти вектора разной длины, а их объем такой, что рано или поздно начинаю писать на диск, и все резко замедляется.

Т.к. не все данные нужны в моменте, ничтоже сумняшеся решил смастерить управление кэшем. Тут то и встал, ибо естественно-научное образование не позволяет порешить эту проблему с наскока.

Хочется и память выделить один раз (чтобы не тратить время на сборку мусора) и использовать её максимально эффективно, но типов данных аж 3, объем данных по типам и длина векторов непредсказуемо разнятся, поэтому тяжело... тяжело.

Что придумал - т.к. есть максимальная длина вектора данных, может по простому создать три двумерных массива для int32, float32 и bool (размер каждого посчитать эмпирически) и писать туда вектора построчно, если длина строки в матрице позволяет, то сразу две строки данных записать туда и т.д.

Но сначала хочу спросить специалистов, может что-то конкретное подскажете? Задача вроде тривиальная, наверняка имеет стандартное решение какое-то?
andrey2185 вне форума Ответить с цитированием
Старый 23.09.2022, 19:27   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А разве это не зависит от решаемой задачи? Если возможно, тогда решайте задачи построчно и не держите все числа в памяти. bool можно заменить bitmap, что сократит длину массива в 8 раз. Можете использовать блочное сжатие данных в памяти и распаковывать нужный блок данных. Это добавит вычислений, но сократит объем одномоментно используемой памяти.

Разбиваете массивы на блоки одинаковой длины (например по 4096 байт - 1 страница в процессоре или 64 кб) и выполняете сжатие этих блоков. Затем по необходимости выбрать определенный индекс выясняете в каком он блоке и распаковываете его в буфер для расчетов.
macomics вне форума Ответить с цитированием
Старый 23.09.2022, 20:04   #3
andrey2185
Новичок
Джуниор
 
Регистрация: 22.09.2022
Сообщений: 4
По умолчанию

macomics, спасибо , подкинули идей, хоть продыхнул
andrey2185 вне форума Ответить с цитированием
Старый 23.09.2022, 21:32   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Я не предложил вам ничего нового. Так делает ОС при выполнении сжатия данных на диске. Только вам не обязательно это сохранять на диск, а достаточно хранить в RAM в виде легкой версии RAM-диска. Так вам станет проще управлять складированием блоков в буферы памяти.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построить класс треугольник и на его основе создать класс параллелограмм, используя механизм наследования smail-2017@list.ru C# (си шарп) 2 27.12.2019 02:25
Построить класс треугольник и на его основе создать класс параллелограмм, используя механизм наследования smail-2017@list.ru Помощь студентам 0 24.12.2019 14:04
Перехватчик кэширования misher Работа с сетью в Delphi 0 11.12.2010 23:17