扫码关注官方订阅号
现在有大约1亿行数据,无法一次性载入内存,请问该如何去重?目前想到方案是 read_table 方法设置 chunk_size 逐块读入,迭代每一块调用 unique 方法去重,但是这个方案好像只能对每一块载入内存的数据去重,如果重复数据分散在不同块就没有办法去掉。请教有没有更好的方案?
认证0级讲师
更新下实操测试:硬件: Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz + 256G RAM + SSD我自己生成了一个一亿行的文本, 没有一行重复, 对这个文本去重操作用了 2 分 20 秒, 内存占用 15.2GB, 小内存机器压力山大
硬件: Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz + 256G RAM + SSD
这个完全可以用UNIX自带的awk搞定, 效率和内存占用都很犀利, 主要利用了awk数组是hashtable实现的特性。内存占用和去重以后的行数(而不是你的文本内容)成正比。我拿了150w行的文本处理时间是不到3秒
awk
150w
3
$ wc -l hello 1510230 hello $ time awk '{ if (!fuckdup[$0]++) { print $0; } }' hello > hello_uniq real 0m2.589s user 0m2.263s sys 0m0.324s
你这一亿行用不了多少内存, 也花不了多长时间
1亿行 文本?去重,是指 2行完全相同的数据?
key:每一行的MD5value:行号
可以借助redis,用hash结构,存进去的都是不重复的,然后根据行号再组织数据。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
更新下实操测试:
硬件: Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz + 256G RAM + SSD我自己生成了一个一亿行的文本, 没有一行重复, 对这个文本去重操作用了 2 分 20 秒, 内存占用 15.2GB, 小内存机器压力山大
这个完全可以用UNIX自带的
awk搞定, 效率和内存占用都很犀利, 主要利用了awk数组是hashtable实现的特性。内存占用和去重以后的行数(而不是你的文本内容)成正比。我拿了150w行的文本处理时间是不到3秒你这一亿行用不了多少内存, 也花不了多长时间
1亿行 文本?
去重,是指 2行完全相同的数据?
key:每一行的MD5
value:行号
可以借助redis,用hash结构,存进去的都是不重复的,然后根据行号再组织数据。