Каков должен быть размер буфера для команды вида?

Необходимо отправить желаемый вывод с вопросом. Мое предположение было этим:

$ awk '{ if($2) printf("%s ", $2); else print ""; }' < dataset
Jim Dice AFDSDFDSFDSFASFA 12343314 
Bob Trumpets AFD232SFDSFASFA 12343314 
Mary Gambling EWDSFDSFASFA 12343314

Обратите внимание, что это - ужасно глупый метод, он не проверяет ничего вообще. Если Ваш вход будет выглядеть несколько отличающимся от того, что Вы отправили его, то вероятно, повредится.

7
23.07.2014, 01:55
2 ответа

Вы не указываете операционную систему и реализацию сортировки; я предполагаю, что вы имеете в виду сортировку GNU. Вы также не говорите, сколько времени "много времени" и как долго вы ожидаете это занять. Самое главное, вы не упоминаете о возможностях подсистемы ввода/вывода, что будет определяющим фактором.

Обычный диск SATA выдает ~150 Мб/с. При такой скорости чтения ваш 150 ГБ файл займет 1000 секунд, около 15 минут. Попробуйте посмотреть Имя файла cat времени >/dev/null . Если ~15 минут (или что-то вроде time cat показывает) в порядке, вы сможете получить сортировку(1) для работы примерно в 3 раза быстрее, потому что вывод тоже должен быть записан.

Лучшим вариантом ускорения будет -параллельное, так как ваши данные помещаются в память и у вас есть свободные процессоры. Согласно инфо-странице, --buffer-size не будет иметь значения, так как

... этот вариант влияет только на начальный размер буфера. Буфер вырастает за пределы SIZE, если `сортировка' встречает входные строки больше SIZE.

, в то время как быстрый поиск указывает на то, что GNU использует сорт слияния , который поддаётся распараллеливанию.

Если вы действительно хотите знать, как GNU сортировка определяет размер буфера и какой алгоритм она использует для параллельной сортировки, то исходный текст coreutils и сопроводительная документация легко доступны.

Но на вашем месте я бы не стал беспокоиться. Что бы вы ни делали с master_matrix_unsorted.csv, сортировка(1), конечно, не подходит.

Во-первых, CSV-файл однажды сбивает вас с толку, потому что синтаксис CSV намного превосходит ken сортировки. Во-вторых, это самый медленный способ, потому что sort(1) вынуждена сортировать целые строки (неопределенной длины), а не только второй столбец. В-третьих, когда вы закончите, что у вас будет? CSV-файл , отсортированный . Это действительно лучше? Почему порядок так важен?

Сортировка звучит как один из шагов на пути к цели, которая, скорее всего, включает в себя некие вычисления на данных, для вычисления которых потребуются числа в двоичном формате. Если это так, то сначала можно получить CSV-файл в более трассируемом, вычисляемом, двоичном формате чисел , скажем, в СУБД. Может оказаться, что сортировка окажется лишней для конечной цели.

4
27.01.2020, 20:19

Здесь упоминается способ вычисления размера буфера сортировки #. Это может дать вам некоторое представление. Не уверен, что это решит вашу проблему. Но стоит прочитать. Об этом упоминается, имея в виду mysql db, он также может применяться по тому же сценарию, что и ваш.

Расчет размера буфера СОРТИРОВКИ

0
27.01.2020, 20:19

Теги

Похожие вопросы