java - 大规模文档共现分析

标签 java multithreading performance processing-efficiency

我有大约 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/

相关文章:

java - FlowLayout 对齐方式更改在 Swing 中不直接可见

java - Android Docx4j 图像错误

objective-c - Objective C - 调节GDC线程以限制CPU使用

python - 在 python 2.6 中获取线程 ID 或名称

objective-c - iOS:CFRunLoopRun() 函数困惑

c++ - 在 C++ 中继承结构的最有效方法?

c# - 为什么与小阵列相比,大阵列的C#SIMD的性能增益较低?

java - 使用 Ant 在远程服务器上执行 java 主类

java - 为什么我无法访问 Docker 中的端点?

Javascript 数组查找效率 : associative vs. 存储关联?