[C con Clase] Orientacion leer enteros

David Fire ddfire en gmail.com
Sab Jul 3 02:01:20 CEST 2010


for (n=0;n<=_ntr-1;n++)
{
   fseeko64 (f1, 3600+((n)*_trl), SEEK_SET);
   fread (&palabra, sizeof(palabra), 1, f1);
   for (i=0;i<=239;i++4)
   {
      printf ("%6d% %6d %11d\n", entero2(palabra[i]), entero2(palabra[i+2]),
entero4(palabra[i]));
   }
}


igual lo que te demora son los 450GB no el for... yo buscaria una
optimizacion haciendo que se guarde en distintos archivos en distintos
discos y podes lanzar varios programas a la vez, lo mas lento aca es leer
del disco.
usar discos en raid 0 o 10 podria aumentarte la velocidad u otro tipo de
raid tambien.






El 2 de julio de 2010 19:18, anonymous.mx <anonymous.mx en gmail.com> escribió:

> Buenas tardes,
>
> Solicito su orientación para analizar unos archivos con valores enteros de
> 2 y 4 bytes, con registros de 240 bytes cada uno desde linux.
>
> Son archivos de 450 GB mas o menos. tardo en leerlos unas 3 horas y me
> gustaria una orientación para leerlo en menos tiempo.
>
> Para hacer el vaciado leo los 240 bytes en una variable char
> con un for con incremento de 4 hago lo siguiente:
>
>  char palabra[240];
> char entero2a[2], entero2b[2], entero4a[4];
> for (n=0;n<=_ntr-1;n++)
> {
>    fseeko64 (f1, 3600+((n)*_trl), SEEK_SET);
>    fread (&palabra, sizeof(palabra), 1, f1);
>    for (i=0;i<=239;i++4)
>    {
>       entero2a[0] = palabra[i];
>       entero2a[1] = palabra[i+1];
>       entero2b[0] = palabra[i+2];
>       entero2b[1] = palabra[i+3];
>       entero4a[0] = palabra[i];
>       entero4a[1] = palabra[i+1];
>       entero4a[2] = palabra[i+2];
>       entero4a[3] = palabra[i+3];
>       printf ("%6d% %6d %11d\n", entero2(entero2a), entero2(entero2b),
> entero4(entero4a));
>    }
> }
>
> Estas 2 funciones las uso para convertir en entero de 2 y 4 para
> convertirlos.
> int entero2(unsigned char* s)
> {
>  int ret;
>  ret = s[0] * 256;
>  ret = ret + s[1];
>  if (ret>32767) ret = ret - 65536;
>  return ret;
> }
> long int entero4(unsigned char* s)
> {
>  long int ret;
>  ret = s[0] * 16777216;
>  ret = ret + s[1] * 65536;
>  ret = ret + s[2] * 256;
>  ret = ret + s[3];
>  if (ret>2147483647) ret = ret - 2147483646;
>  return ret;
> }
>
> Siento lo que me está demorando es el for.
>
>
> Saludos desde Villahermosa, Tabasco, Mexico, America.
> José Luis
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
(\__/)
(='.'=)This is Bunny. Copy and paste bunny into your
(")_(")signature to help him gain world domination.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100702/9564ecf2/attachment.html>


Más información sobre la lista de distribución Cconclase