Article View: uch.ing.dcc
Article #111Re: Desordenar ?
From: Aldrin Martoq A.
Date: Thu, 29 Jul 1999 00:00
Date: Thu, 29 Jul 1999 00:00
84 lines
3524 bytes
3524 bytes
In uch.ing.dcc VASQUEZ MORALES MAURICIO ANDRES <mvasquez@anakena.dcc.uchile.cl> wrote:
> In uch.ing.dcc Jens Hardings Perl <jharding@dcc.uchile.cl> wrote:
> : VASQUEZ MORALES MAURICIO ANDRES wrote:
> :> Hola ... queria preguntar si alguien conocia algun comando
> :> unix o funcion (C o Perl) para desordenar un archivo (desordenar
> :> un arreglo tambien sirve) ya que con archivos de miles de lineas
> :> y con random, los tiempos se me van a las nubes ....
> : Alguna tarea de mechones con un quicksort mal implementado? ;-)
> No ... pa' na .... tengo que hacer una publicidad aleatoria pero que
> se garantice que salga una vez cada aviso ....
> En todo caso se me han ocurrido ideas de como optimizarlo (
> desordenando de a pedazos y luego uniendo) pero la idea era de si habia
> algun comando .... :(
Aqui lo hice en perl, mas de una vez lo necesite, asi que aqui va:
Lee un archivo y lo desordena por lineas. Aqui estan los benchmarks:
los archivos tienen 10mil, 100mil o 1millon de lineas. (cada linea cuenta
desde 0 hasta N).
2:06pm [agm@cipres:~/bin/]% set time
2:06pm [agm@cipres:~/bin/]% ./desordename 10mil 10mil2
0.48u 0.02s 0:00.58 86.2%
2:07pm [agm@cipres:~/bin/]% ./desordename 100mil 100mil2
28.12u 0.19s 0:35.28 80.2%
2:07pm [agm@cipres:~/bin/]% ./desordename 1millon 1millon2
[me aburri, son las 2:25pm]
Este ultimo ocupo 45MB de RAM, segun top.
Entonces, lo que puedes hacer es poner a cada tipo en un archivo y lo
desordenas. Luego, lees el primero, el 2do .. etc, sin desordenar el archivo
a cada rato (para asegurar que a todos le toque su turno). Si llega alguien
nuevo, lo pones al principio o al final; no tienes para que re-desordenar
todo cada vez que agregas uno nuevo.
---desordename---ini---
#!/usr/bin/perl
# desordename
# Copyright(c) 1999
# Aldrin Martoq A.
sub println
{ print $_[0]. "\n"; }
if ($#ARGV < 0 or $#ARGV > 1)
{ println "Uso:\n\t$0 <archivo_entrada> [archivo_salida]";
exit 0;
}
open(ENTRADA, $ARGV[0]) or die "$ARGV[0] no se puede leer: $!";
if ($#ARGV == 1)
{ open(SALIDA, "> $ARGV[1]") or die "$ARGV[1] no se puede escribir: $!"; }
else
{ open(SALIDA, ">&STDOUT"); }
while(<ENTRADA>)
{ push @DATOS, $_; }
while ($#DATOS >= 0)
{ $r = int(rand($#DATOS));
print SALIDA $DATOS[$r];
splice(@DATOS,$r,1);
}
---desordename---fin---
Para crear los numeros del benchmark:
---a---ini---
#!/usr/bin/perl
for ($i=0; $i<$ARGV[0]; $i++)
{ print $i. "\n"; }
---a---fin---
2:16pm [agm@cipres:~/bin/]% ./a 10000 > 10mil
2:16pm [agm@cipres:~/bin/]% ./a 100000 > 100mil
2:16pm [agm@cipres:~/bin/]% ./a 1000000 > 1millon
--
Aldrin.
Area de Ingenieria
CEC U.Chile
Technical Details
Message-ID:
<7nq6bp$92d$1@ict.uchile.cl>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<7no5p5$nso$1@sunsite.dcc.uchile.cl> <379F9F81.423C0FD0@dcc.uchile.cl> <7noe8k$12q$1@sunsite.dcc.uchile.cl>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII-7-bit X-Google-Thread: 1054ea,c5f6fd998f5918bf X-Google-Attributes: gid1054ea,public X-Google-Thread: faaa5,c5f6fd998f5918bf X-Google-Attributes: gidfaaa5,public From: "Aldrin Martoq A." <agm@cec.uchile.cl> Subject: Re: Desordenar ? Date: 1999/07/29 Message-ID: <7nq6bp$92d$1@ict.uchile.cl> X-Deja-AN: 506687405 References: <7no5p5$nso$1@sunsite.dcc.uchile.cl> <379F9F81.423C0FD0@dcc.uchile.cl> <7noe8k$12q$1@sunsite.dcc.uchile.cl> X-Complaints-To: usenet@cec.uchile.cl X-Trace: ict.uchile.cl 933272761 9293 200.9.98.2 (29 Jul 1999 18:26:01 GMT) Organization: Centro de Computacion - U de Chile User-Agent: tin/pre-1.4-980618 (UNIX) (SunOS/5.6 (sun4u)) NNTP-Posting-Date: 29 Jul 1999 18:26:01 GMT Newsgroups: uch.ing.dcc,chile.comp.unix