我有一堆处理文档聚类的代码。一个步骤涉及计算每个文档与给定语料库中的每个其他文档的相似性(对于“相似”的一些不重要的定义),并存储相似性以供以后使用。相似性是分桶的,出于分析目的,我不在乎具体的相似性是什么,只关心它在哪个桶中。例如,如果文档 15378 和 3278 相似度为 52%,则有序对 (3278, 15378) 得到存储在 [0.5,0.6) 桶中。文档有时会在初始分析后从语料库中添加或删除,因此相应的对会根据需要添加到存储桶中或从存储桶中删除。
我正在研究存储这些 ID 对列表的策略。我们发现一个 SQL 数据库(该项目的大多数其他数据都存放在该数据库中)对于我们的目的而言太慢且磁盘空间太大,因此目前我们将每个存储桶存储为磁盘上的压缩整数列表(最初是 zlib 压缩的,但现在使用 lz4 代替速度)。我喜欢这个的事情:
- 阅读和写作都非常快
- 对语料库的事后添加相当简单(lz4 比 zlib 少一点,因为 lz4 没有内置的框架机制,但可行)
- 在写入和读取时,数据可以流式传输,因此不需要一次全部保存在内存中,考虑到我们的语料库的大小,这将是令人望而却步的
很烂的事情:
- 删除是一个巨大的痛苦,基本上涉及流过所有存储桶并写出新的存储桶,其中省略了包含已删除文档 ID 的任何对
- 我怀疑我仍然可以通过更专用的数据结构和/或压缩策略在速度和紧凑性方面做得更好
那么:我应该查看哪些类型的数据结构?我怀疑正确的答案是某种奇异的简洁数据结构,但这不是我非常了解的空间。此外,如果重要的话:所有文档 ID 都是无符号的 32 位整数,并且处理此数据的当前代码是用 C 编写的,作为 Python 扩展,所以如果可能的话,这可能是我们将坚持使用的通用技术系列。