是否可以将CompUnit模块用于收集的数据?

我开发了一个用于处理文档集合的模块。

该软件的一次运行会收集有关它们的信息。数据存储在称为%processed和 的两个结构中%symbols。需要缓存数据以供后续在同一组文档上运行软件,其中一些文档可能会发生变化。(文档本身是使用CompUnit 模块缓存的)。

目前数据结构的存储/恢复如下:

# storing
'processed.raku`.IO.spurt: %processed.raku;
'symbols.raku`.IO.spurt: %symbol.raku;

# restoring
my %processed = EVALFILE 'processed.raku';
my %symbols = EVALFILE 'symbols.raku';

将这些结构输出到可能非常大的文件中可能会很慢,因为散列被解析以创建字符串化形式,并且因为它们正在重新编译而在输入时很慢。

它不用于检查缓存文件,仅用于保存软件运行之间的状态。

此外,虽然这对我的用例来说不是问题,但这种技术不能在一般情况下使用,因为字符串化(序列化)不适用于 Raku 闭包 - 据我所知。

我想知道是否可以使用 CompUnit 模块,因为它们用于存储模块的编译版本。那么也许,它们可以用来存储数据结构的“编译”或“内部”版本?

有没有办法做到这一点?

如果没有,是否有任何技术原因可能无法实现?

回答

(很有可能你已经尝试过这个和/或它不适合你的用例,但我想我会提到它,以防它对你或其他发现这个问题的人有帮助.)

您是否考虑过使用JSON::Fast将数据序列化到 JSON 或从 JSON 序列化?它已经以基本字符串化没有/不可能的方式针对(反)序列化速度进行了优化。这不允许存储Blocks 或其他闭包——正如你提到的,Raku 目前没有一个很好的方法来序列化它们。但是,由于您提到这不是问题,因此 JSON 可能适合您的用例。

[编辑:正如您在下面指出的那样,这会使对某些 Raku 数据结构的支持变得更加困难。通常(但并非总是)通过将数据类型指定为序列化步骤的一部分来解决该问题:

use JSON::Fast;
my $a = <a a a b>.BagHash;
my $json = $a.&to-json;
my BagHash() $b = from-json($json);
say $a eqv $b # OUTPUT: «True»

对于难以在 JSON 中表示的数据结构(例如具有非字符串键的数据结构),这变得更加复杂。该JSON ::类模块,也可以是有益的,但我没有测试它的速度。]


以上是是否可以将CompUnit模块用于收集的数据?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>