Команда сортировки Unix занимает намного больше времени в зависимости от того, где она выполняется ?! (самый быстрый из ProcessBuilder при запуске программы из IDE, самый медленный из терминала) - PullRequest
7 голосов
/ 19 августа 2011

У меня есть Java-программа, которая использует ProcessBuilder для вызова команды сортировки Unix. Когда я запускаю этот код в своей среде IDE (intelliJ), для сортировки 500 000 строк требуется всего около секунды. Когда я упаковываю его в исполняемый файл jar и запускаю его из терминала, это занимает около 10 секунд. Когда я сам запускаю команду сортировки из терминала, это занимает 20 секунд!

Почему огромная разница в производительности и как я могу заставить jar работать с той же производительностью? Средой является OSX 10.6.8 и Java 1.6.0_26. В нижней части справочной страницы сортировки написано "сортировка 5.93 Ноябрь 2004"

Команда, которую она выполняет:

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

Обратите внимание, что когда я запускаю сортировку из терминала, мне нужно вручную экранировать символ табуляции и использовать аргумент -t$'\t' вместо реальной вкладки (которую я могу передать ProcessBuilder).

Выглядит как ps Все выглядит одинаково, за исключением того, что при запуске из IDE команда сортировки имеет TTY ?? вместо ttys000 - но с этот вопрос Я не думаю, что это должно иметь значение. Возможно, BASH замедляет меня? У меня заканчиваются идеи и я хочу сократить этот 20-кратный разрыв в производительности!

Ответы [ 2 ]

12 голосов
/ 22 августа 2011

Я собираюсь рискнуть двумя догадками:

  • возможно, вы вызываете разные версии sort (сделать which sort и использовать полный абсолютный путь для повторного сравнения?)

  • возможно, вы используете более сложные настройки локали (что приводит к более сложной обработке набора символов и т. Д.)? Попробуйте

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

для сравнения

0 голосов
/ 19 августа 2011

Посмотрите на этот проект: http://code.google.com/p/externalsortinginjava/

Избегайте необходимости вызывать внешнюю сортировку полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...