我有大约 1000 个文件。其中每个包含大约 20,000 个文档。我还有一个大约 1,000,000 个单词的列表。
我想计算每个词与任何其他词出现的次数。因此,存在大小为 1M X 1M 的稀疏矩阵。
为了加快计算速度,我通过执行以下操作分别处理每个文件:
1- 我机器中的每个内核都在处理一个文件并输出以下格式的文件
WordId1 WordId2 Frequency
2- 完成每个文件后,我将 1000 个文件合并为一个文件。
这是我目前的方法,但它需要很长时间才能完成,我认为应该有更有效的方法来完成,因此欢迎您提出意见。
最佳答案
我做过这样的一些统计,我把工作分成两步
step1:多线程计数:计算每对的分区id并直接输出相应的分区文件(partition_id =(md5 of pair)/partition_count,分区过程是关键点),(我试过hash_map统计数据(当size大于thread_hold时,将map_data输出到文件,这样可以节省很多磁盘空间,我将输出文件放在不同的磁盘,这样可以加快处理速度)
step2: multi-thread merge:将step1输出的count用map合并(这个过程是在内存中完成的,如果内存不够,选择大的partition_count)
注:mapreduce很容易,step1是map语句,step2是reduce语句,关键过程是partition过程,对应hadoop中reduce过程之前的partition部分
关于java - 大规模文档共现分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21090020/