如果有 33W 行文字,去重应该怎么写呢?

2017 年 12 月 17 日
 daiqiangbudainiu

比如有个 txt 文本,一共有 33W 行文字,以行作为单位,去重,我应该怎么写效率会比较高呢?

我目前用的普通的方法,发现耗时比较长

我列出我目前的方法

    with open('/Users/lizhao/Downloads/aboutchinese.dict.yaml') as f:

        for i in f.readlines():
            if i == '\n':
                continue
            if i not in oldList:
                oldList.append(i)

    with open('tmp.txt','w') as g:
        g.writelines(oldList)

代码渣,请轻喷

7232 次点击
所在节点    Python
44 条回复
l00t
2017 年 12 月 17 日
为啥不用 dict
realpg
2017 年 12 月 17 日
33 万行 这么点数据还考虑啥性能……
wspsxing
2017 年 12 月 17 日
hash
ihciah
2017 年 12 月 17 日
list 查找是线性的似乎…换成 dict 或者 set 会好
fy
2017 年 12 月 17 日
蛐蛐 33w 行,pandas 读入,drop_duplicates,导出,收工。
vimiix
2017 年 12 月 17 日
我的话,可能会先考虑用集合 set,下面是伪代码思路:
values = set()
vals_len = 0

dest_file = open('dest_file', 'w')
with open txt:
for line in readlines():
val = hash(line)
vals_len = len(values)
values.add(val) #主要在这一步借助 set 的不重复特性,判断集合长度是否增长
if len(values) == vals_len+1:
dest_file.write(line)
dest.file.close()

仅供参考,没试验过。
Guaidaodl
2017 年 12 月 17 日
list 的查找是 O(n) 的吧,整个复杂度是 O(n^2)。去重的时候不要用 list, 换成 set 就好了。
em70
2017 年 12 月 17 日
直接 EmEditor 打开 TXT,工具->插件->删除重复行,搞定
rrfeng
2017 年 12 月 17 日
这个题我最喜欢了:

awk '!a[$0]++' file.txt
ytterbium
2017 年 12 月 17 日
这么小数据量,hash, map 都行啊。linux 的话就直接 sort -u,虽然不是最快的,不过简单省心。
ytterbium
2017 年 12 月 17 日
@ytterbium 之前做 nlp 数据预处理去重过 5 亿多行的数据,偷懒用的 sort -u,多线程 1 天不到也就跑完了。30 几万行几秒的事。
param
2017 年 12 月 17 日
转成 set 再转成 list 不知道行不行
ytterbium
2017 年 12 月 17 日
@ytterbium 50 亿
param
2017 年 12 月 17 日
list(set(open('/Users/lizhao/Downloads/aboutchinese.dict.yaml'))) 这样子?不知道性能如何。
cljnnn
2017 年 12 月 17 日
用 set,set 自带去重
ioven
2017 年 12 月 17 日
如果对流程没太多需要直接用 awk 更简单
swulling
2017 年 12 月 17 日
awk dict
wweir
2017 年 12 月 17 日
除了 hash,还可以考虑用排序的方法来做
如果 33w 仅仅是代表大(内存不允许)的话,还可以考虑利用一些磁盘排序的算法
secsilm
2017 年 12 月 17 日
这也不大吧
cxbig
2017 年 12 月 17 日
sort -u dict.yml
awk '!a[$0]++' dict.yml

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

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

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

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

© 2021 V2EX