地址 https://github.com/firebroo/UnixTools/tree/master/uniq
可能有造轮子的嫌疑,去重思想就是借鉴的 awk '!a[$0]++{print}',但是极端情况还是有用的,自己测试当文本超大的时候,速度上可以比 awk 高两倍左右,时间在一个量级内当然这不是特别有用的,但是内存差不多也可以节约二倍左右,个人感觉这还是非常有用的,毕竟内存还是毕竟宝贵的,各位顺便看看还有没有可以优化的余地?
![]() | 1 swulling 2018-07-28 23:03:11 +08:00 via iPad awk 的 hash 表内存占用有点高,支持。 |
![]() | 2 easylee 2018-07-28 23:12:00 +08:00 牛,赞一个。 |
3 lihongjie0209 2018-07-30 08:53:18 +08:00 发一个测试文件出来看看 |
![]() | 4 firebroo OP @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 生成一个随机文件测试。 |
5 engineer9 2018-07-30 10:15:43 +08:00 用了多长时间呀? 9000 万行 |
7 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 我是很佩服了. |
![]() | 8 firebroo OP @lihongjie0209 我说了时间在一个量级意义不大,主要还是内存使用上面。 |
![]() | 9 s1ma 2018-07-30 17:42:10 +08:00 有点溜 |
10 Sfan 2018-07-30 17:57:11 +08:00 确实有点溜 |