gpt4 book ai didi

Mathematica 中的数据缓存

转载 作者:行者123 更新时间:2023-12-02 10:11:13 24 4
gpt4 key购买 nike

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

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

但是,Put 命令不会将长数据集写入文件,而是只写入一行:“timeConsumingOperation[]”,即使我像上面那样用 Evaluate 包装它也是如此。 (说实话,这种行为并不一致,有时会写入数据集,有时则不会。)

如何缓存数据?

最佳答案

我经常使用的另一种缓存技术,特别是当您可能不想将预先计算的表单插入例如一个包裹,就是memoize昂贵的评估,以便在第一次使用时计算它,然后缓存以供后续评估。这可以通过 SetDelayedSet 协同完成:

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

请注意,SetDelayed (:=) 绑定(bind)高于 Set (=),因此隐含顺序评估如下,但您实际上不需要括号:

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

因此,第一次计算 f[1,2] 时,会计算计算延迟的 RHS,从而计算结果值并将其存储为 OwnValue f[1,2]Set

@rcollyer 也是正确的,如果没有参数,则不需要使用空括号,您可以轻松地编写:

g := g = someExpensiveThing[...]

不过,使用它们并没有什么害处。

关于Mathematica 中的数据缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3142671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com