|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.09.2022, 19:04 | #1 |
Новичок
Джуниор
Регистрация: 22.09.2022
Сообщений: 4
|
Как создать эффективный механизм кэширования
Здравствуйте!
Занимаюсь вычислениями, пишу программу. Этапы вычислений в программе будут представлены объектами, которые содержат: ссылки на источники данных (такие же объекты), функцию, выполняемую над входящими данными, и вектор с результатами вычислений, они же входящие данные для других этапов вычислений (кэш с промежуточными результатами). Промежуточные результаты вычислений представлены векторами int32, float32 и bool. Эти вектора разной длины, а их объем такой, что рано или поздно начинаю писать на диск, и все резко замедляется. Т.к. не все данные нужны в моменте, ничтоже сумняшеся решил смастерить управление кэшем. Тут то и встал, ибо естественно-научное образование не позволяет порешить эту проблему с наскока. Хочется и память выделить один раз (чтобы не тратить время на сборку мусора) и использовать её максимально эффективно, но типов данных аж 3, объем данных по типам и длина векторов непредсказуемо разнятся, поэтому тяжело... тяжело. Что придумал - т.к. есть максимальная длина вектора данных, может по простому создать три двумерных массива для int32, float32 и bool (размер каждого посчитать эмпирически) и писать туда вектора построчно, если длина строки в матрице позволяет, то сразу две строки данных записать туда и т.д. Но сначала хочу спросить специалистов, может что-то конкретное подскажете? Задача вроде тривиальная, наверняка имеет стандартное решение какое-то? |
23.09.2022, 19:27 | #2 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
А разве это не зависит от решаемой задачи? Если возможно, тогда решайте задачи построчно и не держите все числа в памяти. bool можно заменить bitmap, что сократит длину массива в 8 раз. Можете использовать блочное сжатие данных в памяти и распаковывать нужный блок данных. Это добавит вычислений, но сократит объем одномоментно используемой памяти.
Разбиваете массивы на блоки одинаковой длины (например по 4096 байт - 1 страница в процессоре или 64 кб) и выполняете сжатие этих блоков. Затем по необходимости выбрать определенный индекс выясняете в каком он блоке и распаковываете его в буфер для расчетов. |
23.09.2022, 20:04 | #3 |
Новичок
Джуниор
Регистрация: 22.09.2022
Сообщений: 4
|
macomics, спасибо , подкинули идей, хоть продыхнул
|
23.09.2022, 21:32 | #4 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Я не предложил вам ничего нового. Так делает ОС при выполнении сжатия данных на диске. Только вам не обязательно это сохранять на диск, а достаточно хранить в RAM в виде легкой версии RAM-диска. Так вам станет проще управлять складированием блоков в буферы памяти.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Построить класс треугольник и на его основе создать класс параллелограмм, используя механизм наследования | 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 |