大文本超快去重工具

2018-07-28 22:40:37 +08:00
 firebroo

简介

地址 https://github.com/firebroo/UnixTools/tree/master/uniq

可能有造轮子的嫌疑,去重思想就是借鉴的 awk '!a[$0]++{print}',但是极端情况还是有用的,自己测试当文本超大的时候,速度上可以比 awk 高两倍左右,时间在一个量级内当然这不是特别有用的,但是内存差不多也可以节约二倍左右,个人感觉这还是非常有用的,毕竟内存还是毕竟宝贵的,各位顺便看看还有没有可以优化的余地?

优点

5551 次点击
所在节点    程序员
10 条回复
swulling
2018-07-28 23:03:11 +08:00
awk 的 hash 表内存占用有点高,支持。
easylee
2018-07-28 23:12:00 +08:00
牛,赞一个。
lihongjie0209
2018-07-30 08:53:18 +08:00
发一个测试文件出来看看
firebroo
2018-07-30 09:49:27 +08:00
@lihongjie0209

```python
import random

def random_str(len):
seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-"
ret = ""
for i in range(20):
ret += random.choice(seed)
return ret

with open("2.log", "w") as f:
for i in xrange(80000000):
line = random_str(30) + "\n"
f.write(line)
```

用 python 生成一个随机文件测试。
engineer9
2018-07-30 10:15:43 +08:00
用了多长时间呀? 9000 万行
firebroo
2018-07-30 10:36:03 +08:00
@engineer9 按照 4#生成的 8 千万行随机数据,我的 Thinkpad i5 上面 1 分 50 秒。
lihongjie0209
2018-07-30 15:17:00 +08:00
```
from datetime import datetime

print("{} start".format(datetime.now()))

with open("3.log", "r") as f:
lines = f.readlines()

print("{} before: {} line".format(datetime.now(), len(lines)))

set_lines = set(lines)
print("{} after: {} line".format(datetime.now(), len(set_lines)))


```

输出:
```
2018-07-30 14:43:24.128476 start
2018-07-30 14:43:47.338141 before: 80000000 line
2018-07-30 14:44:04.591483 after: 80000000 line
```

机器配置: I7, 32G, 固态硬盘, 占用内存 8G



分析:


```
2018-07-30 14:43:24.128476 start
2018-07-30 14:43:47.338141 before: 80000000 line

读取文件耗时 23s

2018-07-30 14:43:47.338141 before: 80000000 line
2018-07-30 14:44:04.591483 after: 80000000 line

去重耗时 17s

```


去重这种事情文件越大, IO 的影响越重. 按照你的生成算法,生成的文件有 1.6G, 这么大的文件全部读取本身就很费时间, 在机械硬盘下这种现象更加明显, 文件大, 文件读取的所占的比重越大.

所以对于这种优化希望还是先 profile 再优化, 楼主能手写 hashtable 我是很佩服了.
firebroo
2018-07-30 17:38:44 +08:00
@lihongjie0209 我说了时间在一个量级意义不大,主要还是内存使用上面。
s1ma
2018-07-30 17:42:10 +08:00
有点溜
Sfan
2018-07-30 17:57:11 +08:00
确实有点溜

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

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

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

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

© 2021 V2EX