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

2017-12-17 00:22:49 +08:00
 warcraft1236

比如有个 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)

代码渣,请轻喷

6512 次点击
所在节点    Python
44 条回复
l00t
2017-12-17 00:25:37 +08:00
为啥不用 dict
realpg
2017-12-17 00:47:29 +08:00
33 万行 这么点数据还考虑啥性能……
wspsxing
2017-12-17 00:48:05 +08:00
hash
ihciah
2017-12-17 00:48:19 +08:00
list 查找是线性的似乎…换成 dict 或者 set 会好
fy
2017-12-17 00:55:19 +08:00
蛐蛐 33w 行,pandas 读入,drop_duplicates,导出,收工。
vimiix
2017-12-17 00:57:25 +08:00
我的话,可能会先考虑用集合 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 01:12:59 +08:00
list 的查找是 O(n) 的吧,整个复杂度是 O(n^2)。去重的时候不要用 list, 换成 set 就好了。
em70
2017-12-17 01:15:02 +08:00
直接 EmEditor 打开 TXT,工具->插件->删除重复行,搞定
rrfeng
2017-12-17 01:32:45 +08:00
这个题我最喜欢了:

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

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

https://tanronggui.xyz/t/415377

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

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

© 2021 V2EX