在Mathematica中缓存数据

Kar*_* W. 2 caching wolfram-mathematica

有一个非常耗时的操作,它在我的包中生成一个数据集.我想保存这个数据集,只有当我手动删除缓存的文件时才让包重建它.这是我的方法作为包的一部分:

myDataset = Module[{fname, data}, 
    fname = "cached-data.mx";
    If[FileExistsQ[fname], 
        Get[fname],
        data = Evaluate[timeConsumingOperation[]];
        Put[data, fname];
        data]
];

timeConsumingOperation[]:=Module[{},
    (* lot of work here *)
    {"data"}
];
Run Code Online (Sandbox Code Playgroud)

但是,不是将长数据集写入文件,Put命令只写一行:"timeConsumingOperation []",即使我用上面的Evaluate包装它也是如此.(确实,这种行为不一致,有时会写入数据集,有时不会.)

你如何缓存你的数据?

Mic*_*lat 8

另一个缓存技术我很经常使用,尤其是当你可能不想插入预先计算的形式,例如一个包,是memoize的昂贵的评估(S),使得它计算在第一次使用,但随后缓存后续评估.这是很容易实现与SetDelayedSet演唱会:

f[arg1_, arg2_] := f[arg1, arg2] = someExpensiveThing[arg1, arg2]
Run Code Online (Sandbox Code Playgroud)

注意SetDelayed(:=)绑定高于Set(=),因此隐含的评估顺序如下,但实际上并不需要parens:

f[arg1_, arg2_] := ( f[arg1, arg2] = someExpensiveThing[arg1, arg2])
Run Code Online (Sandbox Code Playgroud)

因此,你评估第一时间f[1,2],评价延迟RHS被评估,从而导致所得的值被计算并作为存储OwnValuef[1,2]Set.

@rcollyer也是正确的,如果你没有参数你不需要使用空括号,你可以很容易地写:

g := g = someExpensiveThing[...]
Run Code Online (Sandbox Code Playgroud)

但是,使用它们没有任何害处.

  • memoization绝对有用,并且很容易与OP正在寻找的缓存类型相结合.至于不需要空括号,我可以看到它们很好用:让维护程序员知道它是一个计算值.否则,你可能会做一些狩猎,以便能够告诉它每次调用时都会重新计算. (2认同)