使用AWK过滤LARGE分隔文件

时间:2017-08-23 13:49:28

标签: python pandas sorting awk command-line

我正在使用我希望在python中处理的大型(20+ GB)分隔文本文件。我目前的工作流程是在设计时考虑到较小的文件,包括在熊猫中的分类步骤。将20多GB读入内存并不是一个好主意。由于我实际上需要对整个数据进行排序,因此对文件进行分块并不是真的适用...

我目前的策略是在进行任何处理之前使用GNU排序进行排序。在这一点上,我也可以过滤我不需要的字段,所以我有以下一个班轮:

awk '{ print $37,$62,$23,$10,$53,$57,$68,$26,$52,$4,$38,$5,$24 }' ../ck_data/big.txt | gsort --parallel=8 --key=1,1 -n -o ../ck_data/sorted.txt

这里的问题是添加过滤步骤会显着减慢。对整个文件进行排序(没有任何awk)在我的机器上花费不到2分钟,相比之下,两个进程需要16分钟20秒。

有没有办法可以加快过滤过程?我不确定我是否可以有效地利用核心,因为我只有一个文件要处理。对?我之前遇到过子进程和管道的问题,通过临时文件将awk调用与排序分离是否更明智?

1 个答案:

答案 0 :(得分:2)

我开源了一个用于制表符分隔文件的工具,它可以提高过滤步骤的awk速度。该工具为tsv-select,它是eBay tsv utilities toolkit的一部分。与不同awk实现的性能比较是here。等同于awk调用是

$ tsv-select -f 37,62,23,10,53,57,68,26,52,4,38,5,24 ../ck_data/big.txt

您可以尝试的另一种途径是考虑awk的替代版本。在我的测试中,我发现mawk比其他版本的awk更快地执行此任务。请参阅上面列出的基准页面。 (注意:Mac OS X附带的awk版本非常慢.gawk(gnu awk)速度要快得多。可以通过macports或homebrew获得。)