Unix排序命令需要更长的时间,这取决于它在哪里执行?!(最快的ProcessBuilder程序运行从IDE,最慢的从终



我有一个java程序,它使用ProcessBuilder调用unix排序命令。当我在IDE (intelllij)中运行这段代码时,对500,000行进行排序只需要大约一秒钟。当我将它打包到一个可执行的jar中,并从终端运行它时,大约需要10秒。当我自己从终端运行排序命令时,它需要20秒!

为什么在性能上有如此大的差异,我有什么方法可以让jar以相同的性能执行?环境为OSX 10.6.8, java 1.6.0_26。排序手册页底部显示"sort 5.93十一月2004"

它正在执行的命令是:

sort -t'    ' -k5,5f -k4,4f -k1,1n /path/to/imput/file -o /path/to/output/file

请注意,当我从终端运行sort时,我需要手动转义制表符分隔符并使用参数-t$'t'而不是实际的制表符(我可以将其传递给ProcessBuilder)。

看着ps一切似乎都是一样的,除了从IDE运行排序命令有一个TTY ??而不是ttys000——但从这个问题来看,我认为这不会有什么不同。也许是巴斯拖了我的后腿?我已经黔驴技穷,想要缩小这20倍的性能差距!

我将大胆猜测两种情况:

  • 也许你正在调用不同版本的排序(做一个which sort并使用完整的绝对路径来重新比较?)

  • 也许你正在使用更复杂的语言环境设置(导致更复杂的字符集处理等)?试着

     export LANG=C
     sort -t'    ' -k5,5f -k4,4f -k1,1n /input/file -o /output/file
    
比较

看看这个项目:http://code.google.com/p/externalsortinginjava/

完全避免调用外部排序。

最新更新