Реклама на сайте Advertise with us

Быстрый shuffle скрипт

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 17.08.05
Сообщения: 135
Рейтинг: 78

Ссылка на сообщениеДобавлено: 25/11/11 в 20:53       Ответить с цитатойцитата 

всем привет.
очень нуждаюсь в быстром скрипте для рандомного shuffle записей внутри файла. записей более 20лямов.
такие варианты как:
1) cat list| sort -R >list- (под дебиан)
2) cat shuffle.pl
#!/usr/bin/perl -w
srand(time|$$);

@a = <>;

while ( @a ) {
$choice = splice(@a, rand @a, 1);
print $choice;
}
3) cat shuffle2.pl
#!/usr/bin/perl

while (<>) {
$mysort{$_}++;
}
foreach $str (keys %mysort) {
print $str
}
работают плохо и долго.

подскажите хороший скрипт.

0
 



С нами с 15.04.08
Сообщения: 43
Рейтинг: 33

Ссылка на сообщениеДобавлено: 26/11/11 в 03:32       Ответить с цитатойцитата 

не проще засунуть все записи в базу, сделать нужные индексы и рандомно выбирать из базы ?

0
 



С нами с 07.10.01
Сообщения: 4835
Рейтинг: 3672


Передовик Master-X (16.06.2008)
Ссылка на сообщениеДобавлено: 26/11/11 в 11:41       Ответить с цитатойцитата 

А что насчёт php shuffle?
Вот тут есть пример быстрой сортировки. Вкратце - там в массив грузятся не строки целиком, а только позиции начала строк (т.е. числа). Фактически, что-то вроде индексов, для текстового файла. На 500k строк он тестировал, не знаю как насчёт двух лямов будет, но попробовать можно - должно получиться.

Цитата:
If you use the first method, you can load about 50-60k lines for around 25megs of ram, if the lines are about 400-500 characters each. But using the second method (storing line positions), I was able to store 500-550k lines for around 25 megs of ram, which in turn is about 10x more better on ram usage. Alot better!

Лучшие в Рунете: товарная партнёрка - от 4 рублей за клик.
CPA агрегатор - тысячи отличных офферов!

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 26/11/11 в 11:50       Ответить с цитатойцитата 

на думаю, что рнр будет быстрее...
как вариант попробовать разбить файл на мелкие части, через систему, по 1м строк:
split -l 1000000 /pathtofil/myfile
только не уверен, что будет большой выигрыш по времени

о каком времени и объемах идет речь хорошо бы уточнить trollface.png

0
 



С нами с 17.08.05
Сообщения: 135
Рейтинг: 78

Ссылка на сообщениеДобавлено: 26/11/11 в 16:53       Ответить с цитатойцитата 

может пригодиться кому:

cat newlines.pl
#!/usr/bin/perl

use strict;
use warnings;

# Prepare
if(scalar @ARGV < 2) {
print STDERR "Usage: newlines.pl <infile> <outfile>\n";
exit 1;
}

my ($infile, $outfile) = @ARGV;

if(!-e $infile) {
print STDERR "Infile does not exist.\n";
exit 2;
}

if(!open(INFILE, '<', $infile)) {
print STDERR "Unable to open infile.\n";
exit 3;
}

# Load lines
my @lines = ();
my ($n, $f) = (0, 0);

while(<INFILE>) {
push(@lines, $_) and $n++;
}

close(INFILE);

# Shuffle
srand;
while(--$n) {
$f = int(rand($n + 1));
next if $n == $f;
@lines[$n, $f] = @lines[$f, $n];
}

# Output
open(OUTFILE, '>', $outfile);

foreach(@lines) {
print OUTFILE $_;
}

close(OUTFILE);

exit 0;

файл: 600мег, 26лямов строк

время работы скрипта составило полминуты !!!
процесс правда отожрал 2.5гига памяти.

0
 



С нами с 07.10.01
Сообщения: 4835
Рейтинг: 3672


Передовик Master-X (16.06.2008)
Ссылка на сообщениеДобавлено: 26/11/11 в 22:36       Ответить с цитатойцитата 

FreeMann писал:
может пригодиться кому...

Это чтобы сервер класть? icon_smile.gif
2.5 гига )

Лучшие в Рунете: товарная партнёрка - от 4 рублей за клик.
CPA агрегатор - тысячи отличных офферов!

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 26/11/11 в 23:26       Ответить с цитатойцитата 

А почему бы не загнать все это в базу и оттуда кроном генерить уже созданные рандомные куски ?
Скажем каждую минуту берем рандомно 10к записей и их используем.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 



С нами с 17.08.05
Сообщения: 135
Рейтинг: 78

Ссылка на сообщениеДобавлено: 27/11/11 в 12:24       Ответить с цитатойцитата 

kodek писал:
Это чтобы сервер класть? icon_smile.gif
2.5 гига )


почему класть icon_smile.gif
сейчас дедики 16-96гигами оперативки не так и дорого стоят. так что если и отожреться процессом 2.5гига - то даже и заметно не будет.

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

спасибо всем.

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »