【发布时间】:2011-04-23 20:38:07
【问题描述】:
我需要检查大量文本(> 2 Tb,维基百科完整转储)并为每个看到的令牌保留 两个 计数器(每个计数器根据当前事件递增)。我需要对这些计数器进行的唯一操作是增加。在第二阶段,我应该根据这些计数器计算两个浮点数并存储它们。
它应该执行以下步骤:
- 检查大量文本并根据当前事件为找到的每个单词增加 两个 计数器。
- 检查所有标记,为每个标记,根据这些计数器计算两个额外的浮点数。
- 允许查询(获取任何给定令牌的值)。
要求和其他细节:
- 它必须扩展到 O(10^8) 个令牌。
- 需要非常快的查询最终结果!
- 查看文本时,只会增加两个计数器。这是一次性处理,因此在处理过程中不会有任何查询。仅值更新。
- 无需动态/可更新架构。
我一直在尝试 CouchDB 和 MongoDB,但效果不佳。
您认为解决这个问题的最佳方法是什么?
谢谢!
编辑 1: 有人建议我尝试 Patricia trie 并测试所有键是否都适合内存(我怀疑它们不适合)。一个带有额外操作符的自定义 Patricia trie 用于在一步中增加每个键的值可能是一种可能的解决方案。
编辑 2: 阐明了我所说的“巨大”的含义:> 2 Tb 的文本。更多说明。
编辑 3: 唯一令牌估计。正如 Mike Dunlavey 所建议的,我尝试对独特的令牌进行快速估计。在数据集的前 830Mb 中,唯一令牌线性增长到 52134。除非在处理更多数据后唯一令牌的数量增长较慢(这很可能),否则应该有 O(10^8) 个唯一令牌。
编辑 4: 首选 Java 和 Python 解决方案,但任何其他语言也可以。
编辑 5: 通常标记只包含可打印的 ASCII 字符,但它们可以包含任何可打印的 Unicode 字符。我将尝试相同的过程,同时保持小写和大写不变;并且仅适用于小写。
【问题讨论】:
-
您的数据目前是如何存储的?它已经在数据库中了吗?一个大文件?许多不是那么大的文件?您对令牌了解多少——您建议 O(10^12) 字节中的 O(10^9) 个令牌,有多少个唯一令牌? (组)令牌有哪些共同特征?
-
已更新。这是一个完整的维基百科转储。那是在 7z 中压缩的单个 XML,我将其提取为流并动态处理。我目前正在估计唯一令牌编号。您可以在标记中期望自然语言中存在的任何特征,以及一些其他标记,例如标记和标点符号。
-
我会尽力在周末完成这项工作。我会接受答案并在检查后分配赏金。
-
@Luca Martinetti:不,但它与语言模型部分相关。
标签: performance nosql large-data-volumes key-value-store