java - Java:在保持顺序的同时并行过滤大型文本文件
问题描述
假设我在 SSD 上有一个非常大的文件,并且有 48 个内核。我想过滤文本文件(基于行的文本文件),只留下某些句子。然后我想将过滤后的内容写入一个新文件,同时保持原来的顺序。
我认为 Java 并行流不会保持顺序。
我想到的是这样的:创建48个点将文件均匀分割,然后调整指针以从新行开始,然后创建48个线程,每个线程处理不同的块并过滤行(并将结果保存在内存中 -结果比原来的文件小很多),然后把这48个文件一个接一个地写到一个文件中。
这是正确的方法吗,是否有一个 Java 框架,还是应该从头开始编写?
解决方案
在这种特殊情况下,在多线程环境中工作不会提高您的性能。
您正在执行不同线程无法完成的繁重 IO 操作(读取和写入磁盘)。
一旦加载了内容并将其写入磁盘之前,您肯定可以并行化搜索,但对于普通的文本搜索,速度并不能真正提高。
在尝试应用复杂的多线程算法之前考虑一下:
- 编码时间取决于 IO 操作?(网络、磁盘、数据库...)
如果是,并且微积分并不繁重,那么花费大量时间来加快微积分阶段并不是一个好主意,因为 IO 操作的发生时间比内存操作慢数百或数千倍。
顺便说一下,尝试将执行时间拆分为以下部分:
- 在内存中加载文件
- 搜索短语
- 将结果写入磁盘
如果与其他阶段相比,第二阶段确实更快,则并行化不是一个好的解决方案,但您必须尝试其他解决方案。
推荐阅读
- sapui5 - 共享库中的每个 XML 片段文件都使用单独的 HTTP 调用加载,而不是使用预加载文件的内容
- react-native - 要计算在所需时间传递给子组件的值?
- permissions - WSL+samba+git:“错误:将对象添加到存储库数据库.git/objects的权限不足” / git-clone / git-add 权限错误
- c++ - 如何使用带有“外部”键的 std::unordered_map
- python - Python - 服务器运行
- angularjs - ng-init 在 ng-repeat 中使用了两次,只有第一个 ng-init 被评估
- java - 如何在Spring中通过json将参数从表单发送到控制器
- html - 增加滚动标题的不透明度
- mysql - MySQL 存储过程 vs Node.js 性能
- java - java 6环境下如何编译java 7项目