创建 Fact 类来存储事实¶
包含您的 Launchpad 蓝图的 URL
https://blueprints.launchpad.net/congress/+spec/fact-datastructure
目前,congress 运行时将事实存储为 Rules(规则)。从内存角度来看,这效率低下,因为每个 Rule 包含一个 Literal(文字),而每个 Literal 又包含一个 Term(项)用于每一列。这些都是 Python 对象,并且它们也包含一些额外的字段,如 head(头部)、body(主体)、location(位置)、negated(否定)等。使用 Rules 在 CPU 方面也效率低下,因为 congress 需要构造所有这些对象。此蓝图建议使用 Fact 数据结构来存储每个事实。Fact 是原生 tuple(元组)的一个子类,再加上一个用于表名的字段。与使用 Rule 相比,这在内存和 CPU 方面都更有效,因为没有像 Literal 和 Term 这样的额外对象。初步测试表明,初始化表所需的 CPU 减少了 10 倍,内存使用量减少了 3 倍。
问题描述¶
问题详细描述
目前,congress 将每个事实存储为 Rule 对象
Rule 对象包含许多对象和字段
许多对象和字段意味着创建和存储一个事实会消耗大量的 CPU 和内存资源。
高 CPU 和内存使用量导致 congress 无法扩展到更大的数据集。
提议的变更¶
我们建议创建一个名为 Fact 的新类来存储每个事实。Fact 是一个原生 tuple,再加上一个用于表名的字符串。使用 Fact 将消除 Rule 中的所有子字段和子对象。
备选方案¶
无
策略¶
无
策略操作¶
无
数据源¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
初步测试表明,对于 700MB 的 payload,在 7M facts 的 initialize_table() 中,CPU 使用量减少了 10 倍,内存使用量减少了 3 倍。
其他部署者影响¶
无
开发者影响¶
Theory 对象内部将包含 Rules 和 Facts。调用者可以将 Fact 插入到 RuleSet 中。但是,每当有人从 Theory 中获取规则时,RuleSet 会在返回它们之前将 Facts 转换为 Rules。
实现¶
负责人¶
- 主要负责人
ayip
工作项¶
实现 FactSet
在 RuleSet 内部使用 FactSet
修改 initialize_tables() 以避免实例化来自 DSE 的所有事实的列表
依赖项¶
无
测试¶
为 FactSet 添加一个单元测试
文档影响¶
无
参考资料¶
无