1 亿条数据如何使用 Pandas 去重?

2016-09-07 15:14:44 +08:00
 zmrenwu
总数据量大概有 20G ,内存只有 8G ,无法一次载入内存。
查了下 pandas 的 read_csv 方法可以分块地读入数据,同时 DataFrame 对象有一个 unique 方法可以去重。但是好像只能对每一块已载入内存的数据去重,如何整体去重呢?
18909 次点击
所在节点    Python
41 条回复
incompatible
2016-09-07 19:53:00 +08:00
@vinceguo 你这就好比面试时别人让你写代码实现快排,你却直接找了个现成的库函数调用了一下。工具的奴隶。
mringg
2016-09-07 19:54:14 +08:00
估算下去重的数据量
mringg
2016-09-07 19:55:11 +08:00
@mringg 去重后的数据量,如果不大,用 hash 去重吧
necomancer
2016-09-07 19:56:11 +08:00
试试布隆表。。。 pandas 直接是够呛了吧
zmj1316
2016-09-07 20:26:46 +08:00
同意上面说的,先用摘要算法分块再做
vinceguo
2016-09-07 20:35:04 +08:00
@incompatible 煞笔,你从硅提纯开始做起吧
pynix
2016-09-07 21:08:28 +08:00
@vinceguo


吃瓜
gladuo
2016-09-07 21:30:06 +08:00
解决问题的话用数据库或者 spark ;
面试的话 hash 或者 分块进行 merge 再合并;
如果预计去重之后内存还是放不下,该升级内存了 :)
Layne
2016-09-08 00:47:11 +08:00
@zhangchioulin 哈哈哈哈,你的头像自己改了字母?
9hills
2016-09-08 07:58:18 +08:00
地图炮下,假如这是一个面试题目,凡是说排序的,统统不得分

做个简单的测试,首先生成 3000w 行随机数,去重后是 1000w
seq 1 10000000 > 1000w
cat 1000w 1000w 1000w > 3000w
shuf 3000w > 3000w.shuf

然后用 awk hash 的方法去做去重。结果如下

资源占用: 1G 内存, E5-2650 v3 @ 2.30GHz 一个核
时间消耗: 35s

$ time awk '{if($1 in a){}else{a[$1];print $1}}' 3000w.shuf > 1000w.out
awk '{if($1 in a){}else{a[$1];print $1}}' 3000w.shuf > 1000w.out 34.12s user 0.95s system 99% cpu 35.107 total


说排序的,谁能用单机排序去重做到 35s ?
zhangchioulin
2016-09-08 09:52:08 +08:00
@Layne 改了~
Magic347
2016-09-08 10:27:02 +08:00
@9hills
这个应用场景下,题主的痛点显然是资源的受限(现有机器的内存资源不足以 1 次完成全量数据的加载和去重),
对于执行时限上显然不必要求如此苛刻。
而事实上,基于外排序的思想,这一类问题往往易于扩展到海量数据的分布式并行处理上。
而所谓的海量数据就不仅仅是 1 亿条数据那么多了,可能是 TB 量级甚至 PB 量级的,
到那时你还指望你那玩具命令可以跑出结果吗?自己体会一下吧。
9hills
2016-09-08 11:44:30 +08:00
@Magic347 Talk is cheap , show me your code 。

别 TB , PB ,你就写个 3000w 行排序去重给我看看,呵呵

事实上,你以为 hash 不能分布式扩展?去重一定要排序?呵呵
9hills
2016-09-08 11:46:24 +08:00
@Magic347 再说资源, lz 不过 1 亿条未去重数据,按照 hash 来说 8G 足够了。这个就是一个正确的解决方法

你说有其他解决办法, OK , code 拿出来 看看,在 8G 内存条件下,看谁更快
9hills
2016-09-08 12:03:31 +08:00
恰好前不久用 13 台机器+Spark 做了一个排序

100G 的原始数据,需要接近 40min
但是如果用 分布式去重算法的话, 1min 以内

有的时候不能盲目 MR ,盲目 Spark ,不先自己思考下
Magic347
2016-09-08 14:22:58 +08:00
@9hills 见 9 楼,如果你连外排序的思想都没有建立起来过的话,我只能说基本功未必扎实。
你想一下,当年 google 是怎么利用几百兆内存的低配机器搭起来大规模分布式集群的。
不要总纠结在要怎么利用 8G 内存把程序跑得更快这件事情上了。
9hills
2016-09-08 14:51:58 +08:00
@Magic347 知道什么是 Terasort 比赛么,参加过么

你就知道你自己有多么的坐井观天
9hills
2016-09-08 14:53:46 +08:00
@Magic347 另外你的 9 楼里面有一行代码?

拿出 code 来才是王道,而不是说说思想,思想不值钱。 benchmark 才是硬道理
9hills
2016-09-08 15:02:40 +08:00
@Magic347 另外大规模分布式集群,你见过多大的?

恰好负责运维一个 6 位数机器的分布式集群,不知道比起您见过的集群是大呢,还是小呢
zmrenwu
2016-09-08 18:42:41 +08:00
@9hills 嗯,此法值得一试,不过由于我的数据重复率是十分低的,因此可能基于 hash 什么的算法内存依然还是装不下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/304568

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX