2014-09-18 3 views
3

Это общий алгоритмный вопрос, но моей основной средой является Matlab.Избегайте повторного вызова моделирования/функции с теми же аргументами

У меня есть функция

OUT = F (arg1, arg2 ,, .....)

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

По этой причине я хочу избежать вызова f (args) для тех же значений аргументов. Внутри моей программы это может происходить способами, которые не обязательно контролируются программистом.

Итак, я хочу вызвать f() один раз для каждого возможного значения args и сохранить результаты на диске. Затем, когда он вызывается в следующий раз, проверьте, есть ли в данный момент результат для этих значений аргументов. Если это так, я бы загрузил его с диска.

Моя нынешняя идея - создать переменную ячейки с одной строкой для каждого вызова функции. В первом столбце отсутствует. В столбце 2: N - значения argn и проверяют эквивалентность каждого отдельно.

Поскольку переменные типы аргументов меняются, как бы я это сделал?

Есть ли лучший алгоритм?

В целом, как люди справляются с сохранением результатов моделирования на диске и хранением метаданных? (Кроме зубрежки все в имя файла!)

+3

Одним словом, вы пытаетесь реализовать мемонирование. – Jommy

+0

Спасибо. Одно ключевое слово помогло моему поиску безмерно! –

ответ

1

Вы можете реализовать функцию, которая выглядит примерно так:

function result = myfun(input) 

persistent cache 

if isempty(cache) 
    cachedInputs = []; 
    cachedOutputs = []; 
    cache = {cachedInputs, cachedOutputs}; 
end 

[isCached, idx] = ismember(input, cache{1}); 

if isCached 
    result = cache{2}(idx); 
else 
    result = doHardThingOnCluster(input); 
    cache{1}(end+1) = input; 
    cache{2}(end+1) = result; 
end 

Этот простой пример предполагает, что ваши входы и выходы являются скалярными числами, которые могут быть сохранены в массив. Если вам приходится иметь дело со строками или чем-то более сложным, вы можете использовать массив ячеек для кеширования, а не массив. Или на самом деле, может быть, containers.Map может быть даже лучше. Кроме того, если вам нужно кэшировать очень массивные результаты, вам может быть лучше сохранить его в файле и кэшировать имя файла, а затем загрузить файл, если вы обнаружите, что он был кэширован.

Надеюсь, что это поможет!

Смежные вопросы