10亿行TXT文件按150万行分块时剩余行无法写入最后文件问题求助
最简修复方案
你当前代码的核心问题是仅在凑满150万行时触发存储逻辑,文件末尾不足阈值的内容不会触发保存判断,且你误以为listToSort是循环局部变量无法访问——实际上你的listToSort是定义在while循环外部的,只需在循环结束后加一段存储剩余内容的逻辑即可,无任何额外性能开销,无需提前统计行数。
在你原有代码的while循环结束、计时逻辑之前,新增以下代码:
// 新增:保存末尾不足150万行的剩余内容 if (!listToSort.isEmpty()) { String tmpFileLocation = String.format(path, temporaryFileCounter); sortAndSaveListToFile(tmpFileLocation, listToSort); }
可选优化点
- 给BufferedReader设置更大的缓冲区,比如设置8M缓冲区
new BufferedReader(new FileReader(filePath), 8 * 1024 * 1024),比默认8k缓冲区大幅减少大文件读取的IO次数,速度提升明显。 - 用try-with-resources语法包裹BufferedReader的创建逻辑,自动释放文件句柄,避免大文件处理时出现句柄泄漏问题。
- 如果后续处理变长行文本,建议按内存占用阈值分块而非按行数分块,避免出现单块内容过大导致OOM的问题,比如设置单块最大占用1~2G内存就触发存储,适配性更强。
- 当前你拆分行时提前把单词拆分加换行写入临时文件,若后续归并去重逻辑支持按行处理,可以考虑归并阶段再拆分单词,减少临时文件的写入总量,进一步提升效率。
内容的提问来源于stack exchange,提问作者Trusty_Investigator
相关产品推荐
相关产品推荐

