Skip to main content
 首页 » 编程设计

python之高效的大字典表示 M :M relationships in Python

2025年05月04日19pander-it

我有一个非常大的数据集——数百万条记录——我想将其存储在 Python 中。我可能在 32 位机器上运行,所以我想将数据集保持在数百 MB 的范围内,而不是膨胀得比这大得多。

这些记录 - 代表 M:M 关系 - 两个 ID(foo 和 bar)和一些简单的元数据,如时间戳 (baz)。

有些 foo 几乎包含所有 bar,有些 bar 几乎包含所有 foo。但是有很多 bar 几乎没有 foos,还有很多 foos 几乎没有 bar。

如果这是一个关系数据库,M:M 关系将被建模为具有复合键的表。您当然可以轻松地单独搜索任一组件键。

但是,如果您将行存储在哈希表中,则需要维护三个哈希表,因为复合键是哈希的,您无法使用它搜索组件键。

如果你有某种排序索引,你可以滥用词法排序来迭代复合键中的第一个键,而另一个键需要第二个索引;但我不太清楚这相当于标准 Python 集合中的实际数据结构。

我正在考虑一个 foo 字典,其中每个值自动从元组(单行)移动到列表(行元组)到字典,具体取决于某些阈值,以及另一个 bar 字典,其中每个值都是一个 foo,或者foo 的列表。

是否有更有效的 - 速度和空间 - 方法来做到这一点? 任何类型的 numpy 索引之类的?


(我想将它们存储在 Python 中,因为我在使用数据库时遇到了性能问题——包括 SQL 和 NoSQL 变体。你最终成为 IPC memcpy 和序列化绑定(bind)。那是另一回事;但关键是我想要将数据移入应用程序,而不是获得将其移出应用程序的建议 ;) )

请您参考如下方法:

您是否考虑过使用在内存中运行的 NoSQL 数据库,例如 Redis ? Redis 支持大量熟悉的数据结构。

我知道您不想离开应用程序,但不重新发明轮子可以节省时间,坦率地说,它可能更有效率。