创建 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 添加一个单元测试

文档影响

参考资料