🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: uch.ing.dcc
Article #111

Re: Desordenar ?

#111
From: Aldrin Martoq A.
Date: Thu, 29 Jul 1999 00:00
84 lines
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-mail
References: <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