Dot*_*Net 6 java performance multithreading processing-efficiency
我有大约1000个文件.每个文件包含约20,000个文档.我还有一个大约1,000,000个单词的列表.
我想计算每个单词与其他单词出现的时间.因此,有一个大小为1M X 1M的稀疏矩阵.
为了加快计算速度,我通过执行以下操作分别处理每个文件:
1-我机器中的每个核心都在处理单个文件并输出以下格式的文件
WordId1 WordId2 Frequency
Run Code Online (Sandbox Code Playgroud)
2-完成每个文件后,我将1000文件合并为一个文件.
这是我目前的方法,但这需要很长时间才能完成,我认为应该有更有效的方法来做到这一点,所以欢迎你的意见.
你在这里遇到了复杂性的基本法则。您正在尝试处理大量单词的大量文档,并从中生成大量数据集。
它总是会很慢。
有些事情可能会加快速度:
忘记一百万字的清单。相反,只需接受您在文本中找到的任何单词,您以后随时可以过滤它们。如果您确实需要对列表进行过滤,请确保该列表采用适当的形式(例如 HashSet),以便您可以快速检查。
这类事情更有可能是 IO 限制而不是 CPU 限制,因此尝试在快速 SSD 驱动器上运行它 - 或者如果文件足够小,则设置一个 RAM 磁盘并从该磁盘运行它。进行一些监控以确定瓶颈所在。
每组文件的处理正如您已经确定的那样非常并行,因此您可以考虑将其不仅分布在多个核心上,而且分布在多台机器上。
值得尝试的事情(数据库的开销实际上可能会使其变慢):您可以只编译在内存中一起处理一个文档的结果,而不是在最后进行合并。完成处理后,然后将单批插入数据库中。然后,数据库将允许您动态查询结果,使用 sum() 等查找每个单词组合的总计。这实际上为您提供了比平面文件更灵活/有用的结果,并且避免了单独的合并步骤。