#排序 #uniq #命令行 #重复 #命令行工具 #替换 #去重

app huniq

在命令行中过滤重复项。替代 sort | uniq,优化速度(快10倍)。

11 个稳定版本

2.7.0 2022年4月20日
2.6.0 2020年10月30日
2.4.2 2020年8月19日
2.3.0 2020年5月13日
2.1.0 2020年1月19日

#1332 in 命令行工具

每月 33 次下载

BSD-3-Clause

20KB
301

huniq 版本 2

命令行工具,用于从给定输入中删除重复项。请注意,huniq 不对输入进行排序,它只是删除重复项。

SYNOPSIS: huniq -h # Shows help
SYNOPSIS: huniq [-c|--count] [-0|--null|-d DELIM|--delim DELIM]
$ echo -e "foo\nbar\nfoo\nbaz" | huniq
foo
bar
baz

$ echo -e "foo\nbar\nfoo\nbaz" | huniq -c
1 baz
2 foo
1 bar

huniq 替代 sort | uniq(或使用 gnu sort 的 sort -u)和 huniq -c 替代 sort | uniq -c,假设数据已排序,以便可以传递给 uniq。如果需要排序的输出,则应继续使用 sort | uniq

在正常模式下,输出的顺序是稳定的,但在 -c/count 模式下不稳定。

安装

$ cargo install huniq

动机

排序很慢。通过使用散列表/散列集合而不是排序输入,huniq 通常比 sort -usort | uniq -c 快,这是在用 gnu sort/gnu uniq 进行测试时的情况。

版本历史

版本 1 可在此处找到 here.

版本 2 中的更改

  • 添加了 -d/-0 标志,以便您可以指定自定义分隔符
  • 完全用 Rust 重新编写。
  • 版本 2(取决于您查看的基准测试)比版本 1 快 3.5 倍到 6.5 倍

构建

cargo build --release

要运行测试,请执行

bash ./test.sh

基准测试

您可以使用 bash ./benchmark.sh 执行基准测试。它们将一直执行,直到您手动终止它们(例如,按 Ctrl-C)。

这些基准测试通过重复向实现提供 /usr/share/dict/* 中的数据,并使用 Unix time 工具测量内存使用情况和处理数据的所需时间来工作。

对于uniq算法,结果如下:我们可以看到,在性能方面,Rust实现几乎超过了所有其他方法。只有在你真的需要休息一下喝杯咖啡的时候才使用排序,因为使用huniq你不会得到休息!它的性能比C++实现高出6.5倍(对于很少的重复项)到3.5倍(大约98%的重复项)。与sort -u相比:huniq的速度大约快30倍。

如果你在寻找内存效率,请使用datamash,它的速度不如huniq,但内存使用量最少(大约低3倍);如果datamash不行,请使用sort|uniq,它的速度要慢得多,但比datamash稍微多一点点内存。

repetitions  implementation  seconds  memory/kb
1            huniq2-rust        0.26      29524
1            huniq1-c++         1.67      26188
1            awk                1.63     321936
1            datamash           1.78       9644
1            shell              7.30       9736
2            huniq2-rust        0.84      29592
2            huniq1-c++         3.28      26180
2            awk                3.71     322012
2            datamash           4.60       9636
2            shell             16.68       9740
5            huniq2-rust        2.02      29648
5            huniq1-c++         6.21      26184
5            awk                7.69     322012
5            datamash           9.10       9992
5            shell             44.71      10184
10           huniq2-rust        3.40      29676
10           huniq1-c++        12.84      26172
10           awk               16.73     321940
10           datamash          24.44      10032
10           shell             93.75      10036
50           huniq2-rust       14.68      29612
50           huniq1-c++        55.32      26200
50           awk               74.91     321940
50           datamash         103.54      10936
50           shell            453.94      10956
100          huniq2-rust       43.65      29492
100          huniq1-c++       154.99      26180
100          awk              239.66     321956
100          datamash         285.94      12148
100          shell           1062.07      12208

对于计数huniq -c实现,速度优势不是很明显:这里,Rust实现比C++实现快25%到50%,比sort | uniq -c快5倍到10倍。

然而,Rust实现的内存使用增加非常严重:Rust实现需要的内存比C++实现多2.2倍,比sort | uniq多10倍到12倍。

repetitions  implemetation  seconds  memory/kb
1            huniq2-rust       1.47     132096
1            huniq1-c++        1.85      60196
1            awk               2.79     362940
1            datamash          2.28       9636
1            shell             7.71      11716
2            huniq2-rust       2.32     132052
2            huniq1-c++        2.98      60156
2            awk               4.65     363016
2            datamash          5.27       9732
2            shell            16.37      11680
5            huniq2-rust       4.98     132092
5            huniq1-c++        7.54      60128
5            awk               9.37     363016
5            datamash         11.22       9964
5            shell            44.77      11948
10           huniq2-rust       8.81     132048
10           huniq1-c++       13.55      60196
10           awk              16.19     363032
10           datamash         25.12       9908
10           shell            90.01      11976
50           huniq2-rust      45.89     132092
50           huniq1-c++       74.04      60104
50           awk              85.43     362956
50           datamash        141.90      10996
50           shell           454.42      12876
100          huniq2-rust      90.80     132080
100          huniq1-c++      150.41      60196
100          awk             163.13     363008
100          datamash        322.70      12212
100          shell           933.67      14100

未来方向

在功能方面,huniq已经相当完善,但性能和内存使用应在未来得到改进。

这首先涉及到一个更好的基准测试设置,这可能包括一个额外的Rust应用程序,该程序将使用随机数生成器为huniq生成测试数据,并获取参数,如要创建的元素数量、重复项的比率(0-1)、要输出的字符串长度等……

然后基于改进的基准测试能力,可以尝试一些优化,如短字符串优化、区域分配、不同的哈希函数、使用内存优化的哈希表、为uniq函数使用身份函数(因为我们已经提供了哈希值,所以不需要进行第二轮哈希)。

许可证

版权所有 © (C) 2020,Karolin Varner。保留所有权利。

重新分发和使用源代码和二进制形式,无论是否修改,只要满足以下条件

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the Karolin Varner nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

本软件由版权所有者和贡献者提供“现状”以及任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性保证均予以放弃。在任何情况下,Softwear,BV不对任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论该损害是由于何种原因造成的,无论基于何种责任理论,包括合同、严格责任或侵权(包括疏忽或其它)责任,即使已被告知本软件使用可能产生此类损害。

依赖关系

~2.5MB
~41K SLoC