处理大文件行数据去重需流式处理:小数据用map增量去重并标准化;长行用哈希(如murmurhash)降内存;超大数据用分块外排+归并;禁用weakmap。

处理大文件解析出的行数据时,数组去重不能简单用 Set 或 filter + indexOf,否则容易内存爆满或卡死。核心思路是:**边读边判重、流式处理、避免全量加载**。
用 Map 或 Set 做增量去重(适合内存可控场景)
如果单行数据量不大(如日志行、CSV 字段少),且总去重后数据量可接受(比如几百万以内),可用 Map 记录已见行(推荐用 Map 而非 Set,便于后续扩展如计数):
- 逐行解析(例如用
readline模块或createInterface) - 对每行做标准化(trim、统一换行符、忽略大小写等),再作为 key 存入 Map
- 只在 Map 中不存在该 key 时才 push 到结果数组或写入输出流
示例(Node.js):
const rl = readline.createInterface({ input: fs.createReadStream('big.log') });
const seen = new Map();
const uniqueLines = [];
rl.on('line', (line) => {
const clean = line.trim();
if (!seen.has(clean)) {
seen.set(clean, true);
uniqueLines.push(clean); // 或直接 write() 到输出文件
}
});
用哈希代替原始字符串存 Map(降低内存占用)
当行内容很长(如 JSON 行、HTML 片段),直接存字符串会吃光内存。改用哈希值(如 xxHash、murmurHash)作 key:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 引入轻量哈希库(如
murmurhash-native或纯 JS 的murmurhash3js) - 每行计算 32 位整数哈希(4 字节),用
Uint32Array或Set<number></number>存储 - 注意哈希碰撞:可加二级校验(如只对哈希相同的小批次做字符串比对)
外排 + 分块归并(超大数据,10GB+)
当去重后数据仍远超内存(如上亿行),需放弃“全放内存”思路,改用磁盘辅助:
- 将原始文件分块(如每 50 万行一块),每块内先去重并排序(按哈希或内容)
- 将各块唯一行分别写入临时文件
- 用多路归并(类似 merge sort)合并所有临时文件,边读边跳过重复项
工具层面可借助 sort -u(Linux/macOS)预处理:`cat big.txt | sort -u > unique.txt`,它内部就是外排实现,稳定高效。
用 WeakMap?不适用——别踩坑
WeakMap 键必须是对象,不能用于字符串行去重;且它不阻止垃圾回收,无法保证去重逻辑可靠。这里完全用不上,直接忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










