代码之家  ›  专栏  ›  技术社区  ›  Karsten W.

Mathematica中的数据缓存

  •  2
  • Karsten W.  · 技术社区  · 14 年前

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

    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"}
    ];
    

    2 回复  |  直到 14 年前
        1
  •  1
  •   rcollyer    14 年前

    在过去,每当我在评估事物时遇到困难时,通常是当我没有正确地匹配函数所需的模式时。例如,

    f[x_Integers]:= x
    

    f[x_Integer]:=x
    

    不过,在您的情况下,您没有可匹配的模式: timeConsumingOperation[]

    timeConsumingOperation 是相对于 myDataset . 在上面的代码里, 耗时操作 定义在 耗时操作 我的数据集 正在运行。

    SetDelayed ( := )无论何时使用该变量,都会自动重新计算该变量,而且由于不需要传递任何参数,因此不需要方括号。重要的一点是 耗时操作 可以在 我的数据集 将导致在使用之前不执行它。

    总而言之,你的缓存方法看起来正是我该怎么做的。

        2
  •  9
  •   Michael Pilat    14 年前

    我经常使用的另一种缓存技术是 memoize 代价昂贵的计算,因此在第一次使用时进行计算,然后缓存以进行后续计算。这是很容易做到的 SetDelayed Set 一致意见:

    f[arg1_, arg2_] := f[arg1, arg2] = someExpensiveThing[arg1, arg2]
    

    请注意 设置延迟 ( := )绑定高于 ( = ),所以隐含的求值顺序如下,但实际上并不需要paren:

    f[arg1_, arg2_] := ( f[arg1, arg2] = someExpensiveThing[arg1, arg2])
    

    f[1,2] ,计算计算延迟的RHS,从而计算结果值并将其存储为 OwnValue 属于 f[1,2] 具有 .

    g := g = someExpensiveThing[...]