Какой простой способ создать систему напоминания с ограниченной памятью? - PullRequest
4 голосов
/ 17 февраля 2011

Я пишу ручную систему подсчета вычислений (тьфу, в Matlab).Простые детали просты:

  • Способ ввода данных в систему памятки после выполнения вычислений.
  • Способ запроса и извлечения данных из памятки.
  • Способ запроса системы ко всем «ключам».

Эти части не вызывают особых сомнений.Проблема в том, что у моего компьютера ограниченный объем памяти, поэтому когда-нибудь операция «put» должна будет выгружать некоторые объекты из памяти.Я беспокоюсь о «промахах кэша», поэтому я хотел бы иметь какую-то относительно простую систему для удаления помеченных объектов, которые используются не часто и / или не требуют больших затрат для пересчета.Как мне спроектировать эту систему?Части, которые я могу себе представить:

  • Способ сообщить операции 'put', насколько затратным (условно говоря) было вычисление.
  • Способ опциональной подсказки для 'операция 'put', как часто могут понадобиться вычисления (в будущем).
  • Операция 'get' хотела бы заметить, как часто запрашивается данный объект.
  • Способ сообщить целоеСистемный максимальный объем используемой памяти (хорошо, это просто).

Реальная внутренность этого будет в операции 'put', когда вы достигнете предела памяти, и он должен отбраковывать некоторые объекты.на основе их памяти, их стоимости и их полезности.Как мне это сделать?

Извините, если это слишком расплывчато или не по теме.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Я бы сделал это, создав подкласс для DYNAMICPROPS , который использует массив ячеек для внутреннего хранения данных.Таким образом, вы можете динамически добавлять дополнительные данные к объекту.

Вот основная идея проекта:

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

Существует универсальный метод get, который принимает в качестве входных данных номер строки, соответствующий свойству (см. Ниже).Метод get сначала проверяет, является ли столбец 3 пустым.Если нет, он возвращает значение и сохраняет метку времени.Если да, он выполняет вычисление, используя дескриптор из столбца 1 внутри оператора TIC / TOC , чтобы измерить, насколько дорогим является вычисление (которое хранится в col4, а отметка времени хранится в col5).Затем он проверяет, достаточно ли места для хранения результата.Если да, он хранит данные, в противном случае он проверяет размер, а также произведение количества обращений к данным и того, сколько времени потребуется для восстановления, чтобы решить, что отбраковывать.

Кроме того, существуетэто свойство 'add', которое добавляет строку в массив ячеек, создает динамическое свойство (используя addprops) с тем же именем, что и дескриптор функции, и устанавливает для метода get значение myGetMethod(myPropertyIndex).Если вам нужно передать параметры в функцию, вы можете создать дополнительное свойство myDynamicPropertyName_parameters с помощью метода set, который будет удалять ранее вычисленные данные при каждом изменении значения параметров.

Наконец, вы можете добавить несколько зависимых свойств, которые могут указать, сколько их свойств (количество строк в массиве ячеек), как они называются (первый столбец массива ячеек) и т. Д.

1 голос
/ 17 февраля 2011

Рассмотрите возможность использования Java, так как MATLAB работает поверх него и может получить к нему доступ.Это будет работать, если у вас есть маршализуемые значения (целые, двойные числа, строки, матрицы, но не структуры или массивы ячеек).

Контейнеры LRU доступны для Java:

...