LINUX.ORG.RU

Рандомная сортировка большущего файла.


0

1

Нужно реализовтаь сабж стандартными средствами на одной машине. Проблема в том что файлы занимают больше 15гб. Из совсем простых средств имеются sort -R и shuf. Первый работает ооочень медленно, но память не кушает вообще, вторйо работает оочень быстро но загружает все в память.

Есть ли какой-топ ромежуточный вариант? Меня что-то оба не устраивают.

Если порезать файл на куски, каждый кусок отшаффлить, а потом их в случайном порядке склеить - насколько хорошо это будет?

★★★★

Сегодня утром именно этим занимался) У split можно указать --number=r/N, тогда он будет в round-robin fashion выводить строки в N файлов. А потом shuf + cat.

lomereiter
()

Если порезать файл на куски, каждый кусок отшаффлить, а потом их в случайном порядке склеить - насколько хорошо это будет?

Зачем в случайном, если можно сделать слияние файлов, э-э-э, как в сортировке слиянием, только не двух массивов, а N файлов?

metar ★★★
()

Может, навелосипедить свое? С mmap'ом и разбиением на файлы.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от urxvt

не, у меня есть файл со строками, размером в 30Гб. надо получить из этого файла случайную выборку строк, скажем надо выбрать 30000 случайных строк.

OxiD ★★★★
() автор топика
Ответ на: комментарий от lomereiter

Я за распределение боюсь.

У меня данные идут большими схожими кусками подряд. Хочется чтобы в результате были представители разных кусков, а похожих элементво был минимум.

Хотя кажется если делать round-robin то все будет ок.

OxiD ★★★★
() автор топика
Ответ на: комментарий от red_eyed_peguin

ООо, спасибо!!! Попробую.

OxiD ★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

А сортировтаь ничего и не надо? sort -R делает как раз обратную операцию ;)

OxiD ★★★★
() автор топика
Ответ на: комментарий от OxiD

А взять случайно одну строку данных, затем записать все положения ее же в этом файле, выбрать наибольший кусок и вывести его не подойдет?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Не, строки все уникальны, но похожи. Скажем так - текст на одну тему.

OxiD ★★★★
() автор топика
Ответ на: комментарий от OxiD

скажем надо выбрать 30000 случайных строк

А (если верхняя граница известна +общее число строк) нельзя: отсорировать 30000 случайных индексов -> пройтись по файлу, выцепляя строки -> перемешать?

anonymous
()
Ответ на: комментарий от OxiD

Взяли случайные - получили по возрастанию: 14 , 42 , 666 ... etc, дабы из файлы вытащить в один проход.

anonymous
()
Ответ на: комментарий от anonymous

Можно попробовать, это надо тогда свою утилиту писать. А хотелось бы стандартными башевскими средствами

OxiD ★★★★
() автор топика

А что такое «рандомная сортировка»? Bogosort?

aedeph_ ★★
()
Ответ на: комментарий от anonymous

кажется это чоень долго? O(n^2) ? Я все таки попробую чуть позже sort -S500M -R и отпишусь что вышло ;)

OxiD ★★★★
() автор топика
Ответ на: комментарий от OxiD

Я все таки попробую чуть позже

замечу, на всякий случай, что для приведенного кода в «indices» номера не должны повторяться

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.