Выбрать N случайных строк из файла общедоступными инструментами *nix

Выбрать N случайных строк из файла общедоступными инструментами *nix

03.07.2019 10:06:04 Просмотров 19 Источник

Файл текстовый, UTF-8, 500 тысяч строк, длинной от 5 до 185 байт каждая.

Интересует в первую очередь оптимальное по времени решение.

Под общедоступными должно понимать инструменты, которые можно найти на любом *nix VDS из коробки, включая Linux, FreeBSD, OpenBSD и так далее.

Сейчас используется PHP и время устраивает, но бытует мнение, что можно быстрее:

<?php
function sample (array $data, int $n) : array {
    $results = [];
    $last = count ($data) - 1;
    while (count ($results) < $n)
        if ( ! isset ($result [$r = $data [rand (0, $last)]]))
            $results [$r] = TRUE;
    return array_keys ($results);
}

Обратите внимание, что мерить скорость загрузки данных в память не нужно.

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1692333_998829
@aleksandrbarakin ответом? )
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1692338_998829
@Suvitruf, это же не ответ: программа shuf никаким боком не входит в «стандартные инструменты *nix». «стандартными» же «интсрументами» решение будет очень громоздким, и придумывать его нет никакого желания. помимо прочего сама формулировка вопроса («оптимальное по времени решение») уже подразумевает, что вопрос надо бы закрывать как слишком общий: требуется сравнить несколько решений и обосновать выбор «оптимального по времени» (что бы это ни значило).
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1692510_998829
@aleksandr barakin, все верно именно это и требуется. зачем закрывать вопрос не понятно. не нравится, просто проходите мимо.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1692559_998829
@leninel так а нет же голосов за закрытие
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1692601_998829
Можно ли "стандартными средствами" выполнить reservoir sampling ?
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1692853_998829
По вашей ссылке цитата: "Обычно, n достаточно велико, чтобы весь список не уместился в основной памяти.". У нас как раз случай когда все в памяти поместится точно. Нужно быстро.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1693179_998829
@leninel, так оно от этого медленнее не становится.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694439_998829
Взял на себя наглость убрать «стандартные» из вопроса, так как стандарты в мире *nix очень широко трактуются. Например, sed под macOS (которая официальный Unix) совсем не тот же sed что под Linux. И так далее и тому подобное.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694457_998829
@sanmai да и brew, кстати, совершенно не является «штатной утилитой»
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694589_998829
@andreymal давайте и не загонять исходный вопрос в жесткие рамки ограниченного мышления автора, мы тут общественное дело делаем, а не какому-то одному человеку помогаем что-то решить (такие, другие, вопросы вообще оффтопик)
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694693_998829
@sanmai можете создать отдельный вопрос, описав в нём желаемые вами критерии и сделав в нём общественное дело ;)
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694713_998829
@sanmai brew отсутствует в изкоробочной поставке macOS, а Apple не предоставляет никакого официального способа его установки (потому что brew не имеет вообще никакого отношения к Apple), и ваши рассуждения о «фактическом стандарте» — это лишь ваши личные рассуждения и не более того. То, что каждый первый продвинутый пользователь macOS первым делом ставит brew, не делает его «штатной утилитой». Кроме того, может быть так, что автору нужна работоспособность решения условиях отсутствия интернета и запрета подключения внешних устройств хранения данных, где ни о brew, ни о apt речь идти не может
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694761_998829
также можно и про rpm, pip как о brew говорить. brew - это сторонняя утилита
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694782_998829
@andreymal это теперь вы за автора додумываете
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1694792_998829
@sanmai поэтому я и не делаю соответствующих правок ;) Сказано из коробки — значит из коробки, а про apt и brew додумывать не надо)
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1695088_998829
Эм, пхп есть далеко не на любом *nix VDS... Описанные в вопросе условия теперь просто противоречат друг другу
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1696243_998829
@sanmai у вас сегодня прям день додумываний какой-то: то про MIT, то про плашку, теперь вот про то, что нет других *никсов кроме линукса
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix#comment1696468_998829
@andreymal другие варианты есть, но автор судя по всему (как вы сами заметили) не понимает того зоопарка, который есть в мире *nix, потому даёт противоречивые требования.

Ответы - Выбрать N случайных строк из файла общедоступными инструментами *nix / Выбрать N случайных строк из файла общедоступными инструментами *nix

Владимир Сумароков
shuf file.txt -n5

file.txt - ваш файл

5 - количество строк(любое число)

Описание команды на сайте GNU (к вопросу о "стандартности")

https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000406#comment1692577_1000406
К вопросу о «стандартности» в macOS никакого GNU не завезли, например :)
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000406#comment1694442_1000406
Потому ни о какой «стандартности» говорит не приходится. Нет её.
Является ответом!
Senior Pomidor

08.07.2019 10:05:19

можно использовать sort -R input | head -n N, но скорость работы будет значительнее ниже, чем того же shuf ,но лучше сравнить результаты.

На моем ноутбуке с SSD дискоим, 16 Гб ОЗУ 2133 MHz, Intel Core i7-7700HQ 2,8 GHz слудующие результаты:

У меня есть файл размером 2.6G и с 13,9 млн строк данных

➜  /tmp wc -l test.log
 13904430 test.log

➜  /tmp time awk 'rand() <0.001' < test.log |wc
   13945   32795 2774781
awk 'rand() <0.001' < test.log  124.15s user 1.18s system 99% cpu 2:05.68 total
wc  0.01s user 0.00s system 0% cpu 2:05.68 total


➜  /tmp time sort -R test.log | head -n 10000 >/dev/null
^C^C (тут я не дождался и отменил процесс)
sort -R test.log  751.22s user 72.00s system 54% cpu 25:02.76 total
head -n 10000 > /dev/null  0.00s user 0.00s system 0% cpu 25:01.63 total


➜  /tmp time shuf -n 10000 test.log |wc
   10000   23637 1986699
shuf -n 10000 test.log  4.59s user 0.66s system 98% cpu 5.326 total
wc  0.01s user 0.00s system 0% cpu 5.325 total

 ➜  /tmp time perl -ne 'print if (rand() < 0.001)' test.log | wc
   13872   32644 2755088
perl -ne 'print if (rand() < 0.001)' test.log  1.74s user 0.70s system 99% cpu 2.454 total
wc  0.01s user 0.00s system 0% cpu 2.453 total

также написал ради эксперимента вот такую функцию, но не дождался результата больше 20 минут

➜  /tmp function rread() { while read line; do
    if ((RANDOM%1390)); then
        echo $line;
    fi;
done < $1  }
➜  /tmp time rread test.log > /dev/null

итоговый результат таков:

  1. perl за 2.453
  2. shuf за 5.325
  3. awk за 2:05.68
  4. sort -R больше, чем 25:01.63
  5. read думаю больше, чем в 4 пункте

p.s. также решил пропробовать через sed выдернуть строку. написал вот такой скрипт

#!/bin/bash

RANGE=$(wc -l < $2)
for i in `seq 1 $1`
{
  number=$(echo $RANDOM % $RANGE + 1 | bc)
  sed -n ''${number}'p' $2 
}

результат удручающий

➜  /tmp time ./custom.sh 10 test.log | wc
      10      22    1567
./custom.sh 10 test.log  35.91s user 6.76s system 99% cpu 42.872 total
wc  0.00s user 0.00s system 0% cpu 42.871 total

➜  /tmp time ./custom.sh 100 test.log | wc
     100     197   16407
./custom.sh 100 test.log  362.07s user 70.14s system 99% cpu 7:15.37 total
wc  0.00s user 0.00s system 0% cpu 7:15.37 total

UPDATE

cat <<'EOT' >> p.php 
<?php
ini_set ('memory_limit', '8192M');
$t0 = microtime (TRUE);
$file = 'data.txt';
$data = (is_file ($file) and is_readable ($file)) ? file ($file) : [];
$t1 = microtime (TRUE);
const LIMIT = 10;
$results = [];
$last = count ($data) - 1;
while (count ($results) < LIMIT) if ( ! isset ($result [$r = $data [rand (0, $last)]])) $results [$r] = TRUE;
$results = array_keys ($results);
$t2 = microtime (TRUE);
printf ("%s, %s", number_format ($t1 - $t0, 8), number_format ($t2 - $t1, 8));

?>
EOT
➜ php -f p.php
12.23668194, 0.00460792

хочу заметить, что весь процесс от запуска и до завершения скрипта больше на 2-3 секунды. Я думаю, было бы правильно и это время учитывать.

UPDATE2


#include <iostream>
#include <fstream>
#include <string>
using namespace std;


unsigned int rand_interval(unsigned int min, unsigned int max);

int main(){
 ifstream is("test.log");

 char c;
 string line;
 int count=13000;
 while (!is.eof() && count-->0){
  while (c != '\n'){
   unsigned int rand = rand_interval(0, 13900000);
   is.seekg(rand);
   c = is.get();
  }
  getline(is,line);
  cout << line << endl;
  c = '0';
 }


 return 0;
}

unsigned int rand_interval(unsigned int min, unsigned int max)
{
    int r;
    const unsigned int range = 1 + max - min;
    const unsigned int buckets = RAND_MAX / range;
    const unsigned int limit = buckets * range;
    do
    {
        r = rand();
    } while (r >= limit);

    return min + (r / buckets);
}

и результат

➜  /tmp time ./a.out | wc
   13000   29103 2209950
./a.out  4.54s user 7.00s system 98% cpu 11.672 total
wc  0.02s user 0.07s system 0% cpu 11.671 total
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1693111_1000432
У решений в духе rand() <0.001 есть два косяка: во-первых, они неточные, а во-вторых, в них заложено знание пользователя о числе строк. У честных решений надо сначала посчитать число строк и будет два чтения файла, так что они будут примерно вдвое медленнее. В принципе, shuf примерно такой результат и показал.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1693158_1000432
да, ты прав. я примерно апроксимировал результат к 13.9к. shuf, конечно же рвет в простоте использования и в быстроте работы
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1693181_1000432
А вообще, к вопросу в комментарии ссылку на алгоритмы добавили - один проход при неизвестной длине.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1694909_1000432
а вы не могли бы померить пхп скрипт из первого поста на своих данных?
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1694980_1000432
@leninel я не знаю php. я не понимаю как мне скормить файл. если поможете, то я запущу проверку
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1695026_1000432
смотрите первый пост
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1695079_1000432
@leninel обновил.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1695086_1000432
если несколько раз подряд запускать, то время уменьшается и постепенно стремится к 6.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1696861_1000432
@Qwertiy, вы уверены, что 50Мб файл во второй раз будет читаться примерно за то же время, что и в первый?
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1696909_1000432
@avp, не знаю. Думаешь, в кэше диска останется? Но в ответе на 2.6 ГБ проверяли.
https://ru.stackoverflow.com/questions/998829/%d0%92%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-n-%d1%81%d0%bb%d1%83%d1%87%d0%b0%d0%b9%d0%bd%d1%8b%d1%85-%d1%81%d1%82%d1%80%d0%be%d0%ba-%d0%b8%d0%b7-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%be%d0%b1%d1%89%d0%b5%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%bc%d0%b8-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d0%bc%d0%b8-nix/1000432#comment1696920_1000432
@Qwertiy, 2ГБ может и не останется, но в вопросе вроде речь о ~50M ("500 тысяч строк, длинной от 5 до 185 байт каждая")
Закрыть X