gpt4 book ai didi

caching - 如何在 Rascal MPL 中序列化/反序列化数据到文件

转载 作者:行者123 更新时间:2023-12-05 01:22:20 24 4
gpt4 key购买 nike

我需要一种在 Rascal 中序列化数据的方法,因为某些操作可能相对较慢,并且需要某种快速缓存形式。例如 AST 的构建。

我正在使用以下代码段从指定位置的项目构建 AST:

list[Declaration] getASTs(loc projectLocation) {
M3 model = createM3FromMavenProject(projectLocation);
list[Declaration] asts = [createAstFromFile(f, true)
| f <- files(model.containment), isCompilationUnit(f)];
return asts;
}

现在构建一个特定的 AST 需要一些时间(大约 2-3 秒)。因此,我希望将结果缓存在一些转储文件中:

loc smallsqlLoc = projectLoc + "smallsql0.21_src";
loc dumpLoc = projectLoc + "dump/smallsql.bin";

if(!exists(dumpLoc)) {
list[Declaration] dumpAsts = getASTs(smallsqlLoc);
writeFile(dumpLoc, dumpAsts);
}

然后将其读回内存(希望会更快):

if(!exists(dumpLoc))
throw "Error: dump does not exist.";
list[Declaration] asts = readFile(dumpLoc);

但是readFile的返回类型是str,不是list[Declaration]。简单的转换显然不能解决问题。我怎样才能让我最初写入文件的 AST 回到内存中?更一般地说,如何在 Rascal 中对文件中的任何数据类型进行序列化和反序列化?

最佳答案

您正在寻找writeBinaryValueFile (以及 readBinaryValueFile)它们负责读取和写入几乎所有无赖值(函数除外,我们无法序列化它们)。

您使用的 writeFile 用于文本文件,但它们并不用于数据存储(除非您正在生成源代码)。

使用示例:

model = createM3FromMavenProject(projectLocation);
writeBinaryValueFile(|tmp:///test.cache|, model);
model2 = readBinaryValueFile(#M3, |tmp:///test.cache|);

因此,关于缓存,如果您想要跨运行时缓存,writeBinaryValueFile 是可行的方法。如果您需要在同一个 session 中进行缓存,您可以查看 @memo 标记,它充当缓存。没有清楚地记录下来,但您可以查看围绕此功能的测试:lang::rascal::tests::basic::Memoization .

关于caching - 如何在 Rascal MPL 中序列化/反序列化数据到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74328261/

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