[C con Clase] Orientacion leer enteros

Jorge Medina jorge en bsdchile.cl
Lun Jul 5 05:03:46 CEST 2010


2010/7/2 David Fire <ddfire en gmail.com>:
> 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.
>
ademas podrias programar hebras que procesen partes del archivo
blockes / numero_de_hebras sera la reduccion en tiempo de
procesamiento del archivo.
>
> 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.
>
>
> _______________________________________________
> 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
>



-- 
Jorge Andrés Medina Oliva.




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