对于以下典型案例:
n = 1000000;
r = randi(n,n,2);
(假设所有行之间有0.05%的公共数字; n
甚至可能是数千万)
我正在寻找一个 CPU和内存有效的解决方案来根据任何常见项目(这里是整数)合并行。可以使用 here 获取Python中的示例代码列表,并可以快速尝试将其转换为Matlab here 。
在我的尝试中他们需要花费很长时间(几分钟到几小时),所以我赞成找到更快的解决方案。
对于上面的示例,典型输出应该看起来像(单元格):
{
[1 90 34 67 ... 9]
[35 89]
[45000 23 828 130 8999 45326 ... 11]
...
}
另请注意,我尝试编译为 mex 但由于Matlab-Coder中不支持单元格而失败。
编辑:一个小小的演示示例
%---------------------------------------
clc
n = 100;
r = randi(n,n,2); % random integers in [1,n], size(n,2)
%---------------------------------------
>> r
r =
82 17 % (1) 82 17
91 13 % (2) 91 13
13 32 % (3) 91 13 32 merged with (2), common 13
82 53 % (4) 82 17 53 merged with (1), common 82
64 17 % (5) 82 17 53 64 merged with (4), common 17
...
94 45
13 31 % (77) 91 13 32 31 merged with (3), common 13
57 51
47 52
2 13 % (80) 91 13 32 31 2 merged with (77), common 13
34 80
%---------------------------------------
c = merge(r); % cpu and memory friendly solution is searched for.
%---------------------------------------
c =
[82 17 53 64]
[91 13 32 31 2]
...
答案 0 :(得分:0)
你需要一个索引。
在Python中,使用dict。在MATLAB中 - 我不使用MATLAB,因为开源是未来,而MATLAB正在消亡。
但是Python很慢。使用例如,您可以获得10倍的加速Cython用于翻译和优化C中的代码。避免使用list
int
等Python数据类型,因为它们非常占用内存。 numpy具有内存有效的整数数组。
如果您获得新对(a,b),则可以使用此词典查找要合并的现有项目。然后在合并后更新dict。 实际上对于整数,你应该使用数组而不是字典。
最棘手的部分是当a和b都存在时处理这种情况,但是是不同的大组。如果还不够快,可以在这里进行一些简洁的优化。
它不是群集,而是连接的组件。