我有一个数据缩减问题,事实证明该问题很难解决。
本质上,我有一个程序,可以从总共约 6000 万个键的集合中计算键对的增量值(浮点)。该程序将“相对”快速地生成约 53万亿对的值(简单地迭代这些值将需要大约三天的时间)。并不是每对键都会出现,很多对会出现很多次。没有合理的方法可以让这些对按特定顺序出现。我需要的是一种找到为每对键生成的值之和的方法。
对于适合内存的数据来说,这是一个非常简单的问题。在 python 中,它看起来像这样:
from collections import Counter
res = Counter()
for key1,key2,val in data_generator():
res[(key1,key2)] += val
Run Code Online (Sandbox Code Playgroud)
当然,问题在于这样的映射不适合内存。因此,我正在寻找一种结合磁盘和内存处理来有效地完成此操作的方法。
到目前为止我已经尝试过:
ON CONFLICT UPDATE。事实证明,这实在是太慢了。在这一点上,我希望有人有更好的方法可供我尝试。有没有办法把这个问题分解成更小的部分?是否有解决此类问题的标准 MapReduce 方法?
任何提示或指示将不胜感激。谢谢!
编辑: 我使用的计算机有 64GB RAM、96 个内核(我的大部分工作都非常可并行)和 TB 级 HDD(以及一些 SSD)存储。
很难估计缩减结果中的密钥对总数,但肯定至少有数千亿。
我正在研究一个统计项目,该项目涉及迭代所有可能的方法来对字符串集合进行分区并对每个字符串运行简单的计算.具体来说,每个可能的子字符串都有与之关联的概率,而我正试图获得分区中子字符串概率乘积的所有分区的总和.
例如,如果字符串是'abc',则可能存在'a','b','c','ab,'bc'和'abc'的概率.字符串有四种可能的分区:'abc','ab | c','a | bc'和'a | b | c'.算法需要找到每个分区的分量概率的乘积,然后对四个结果数求和.
目前,我已经编写了一个python迭代器,它使用分区的整数二进制表示(例如上面例子中的00,01,10,11),并简单地遍历整数.不幸的是,对于长度超过20个字符的字符串来说,这个速度非常慢.
任何人都可以想到一种聪明的方法来执行此操作,而不是一次只运行一个分区吗?我已经被困在这几天了.
回应一些评论,这里有一些更多信息:
字符串可以是任何东西,例如"foobar(foo2)" - 我们的字母表是小写字母数字加上所有三种类型的大括号("(","[","{ "),连字符和空格.
目标是得到给出单个"单词"可能性的字符串的可能性.所以L(S ='abc')= P('abc')+ P('ab')P(' c')+ P('a')P('bc')+ P('a')P('b')P('c')(这里"P('abc')"表示概率'word''abc',而"L(S ='abc')"是观察字符串'abc'的统计可能性.