Python list 数组 4 千万个元素去重、处理

2019-07-15 14:24:15 +08:00
 v2mo

如题
主要问题:千万级别处理起来会不会崩溃?

主要是去重

谢谢

5190 次点击
所在节点    Python
42 条回复
misaka19000
2019-07-15 15:04:46 +08:00
不是,你也说一下你每条数据多大啊,每条数据 1kb 和每条数据 10mb 当然不一样
vincenttone
2019-07-15 15:17:08 +08:00
既然 4 千万个元素能放进数组里,说明你内存就够用,去重就是了,就看算法对内存的使用和耗费的 cpu 时间了。
flyingghost
2019-07-15 15:27:00 +08:00
4kw 个 int,160M,可以直接放内存。
设计一个分布尽可能均匀的散列函数(这一步不太确定我不是搞数学的。瞎拍一个 md5(obj)//4kw 的算法不知道效果怎么样?)
遍历每个 obj 求 hash,把 obj 的 index 放在对应的桶里。
如果桶里已有元素( hash 冲突),单独放在另一个冲突列表里。
对于冲突列表里的每个冲突 hash,遍历并精确对比每个 obj,从源数据集删除完全相同的 obj。

稍微注意一下 getObj(index)的 O(1)复杂度,理论上可以应对任意量的数据了。
princelai
2019-07-15 15:36:28 +08:00
@ipwx #8 只替换最后一步

%timeit np.unique(arr)
11.4 s ± 401 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
dyllanwli
2019-07-15 15:58:33 +08:00
scalaer
2019-07-15 16:01:17 +08:00
看看 bitmap
lihongjie0209
2019-07-15 16:03:27 +08:00
@mggis0or1 bitmap 对于非数字型的元素无法支持, 还是用布隆过滤器吧
reus
2019-07-15 16:10:58 +08:00
你这水平,处理什么都会崩溃
自己不会试验吗
要问人,又不说清楚细节
limuyan44
2019-07-15 16:32:30 +08:00
讨论这么多写个代码就这么难吗也没几行啊
NullErro
2019-07-15 16:47:26 +08:00
想在内存跑的话,简单直接暴力的就是用 set, 推荐布隆过滤器;每个元素比较大的话可以考虑 mr,spark 或者其他分布式计算框架
arrow8899
2019-07-15 16:51:42 +08:00
首先你要清楚数据的特征啊 整形?浮点数?短字符串?超长字符串?数据分布?重复概率?这些都会影响去重的效率!!!
V2EX √
动手实践 ×
changs1986
2019-07-15 17:09:22 +08:00
bloomfilter ?
thedog
2019-07-15 18:19:48 +08:00
@Takamine excel 最大 100 万条记录吧。
thedog
2019-07-15 18:20:18 +08:00
bitmap+1
shm7
2019-07-15 18:33:56 +08:00
试试 numpy 吧,python list 遍历会检查类型,每次都会。
Hamniba
2019-07-15 19:40:14 +08:00
@flyingghost #23
你这个就是 Hash Table 的思想,getObj(index) 是 O(1),但是求一遍 hash 还是得 O(n) 啊。
smdbh
2019-07-15 20:14:31 +08:00
天天 4 千万,和每月,每年是有区别的。
但是,其实也没多大区别
Gooeeu
2019-07-15 20:31:33 +08:00
Bloom Filter
sazima
2019-07-15 20:37:49 +08:00
list(set(item))
sazima
2019-07-15 20:43:53 +08:00
![]( https://i.loli.net/2019/07/15/5d2c746fe371343950.png) 粗略的感觉,耗时不到一秒... 也可能不到 0.5.

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

https://tanronggui.xyz/t/583069

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

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

© 2021 V2EX