Esta bien. Esta es la funcion en la que el programa demora los 41 minutos ejecutando:
int LoadNextQuoteIntoQuotesmem (struct __csvheader *csvheader, struct __quotesmem *bQuotesmem)
{
char c;
int i, k;
char szBuffer[MTFMT_MEM_QUOTEMAX];
//fsetpos(csvheader->hFile, &(csvheader->fpos));
for (i=0;i<MTFMT_CSV_QUOTEN;i++)
{
c=0;
for(k=0;c!=','&&c!='\r'&&c!='\n';k++)
{
c=csvheader->bBuffer[csvheader->fpos];
csvheader->fpos++;
if(c==0/*EOF*/)
{
return MTERR_CSV_EOF;
}
szBuffer[k]=c;
}
szBuffer[k-1]=0;
switch(i)
{
case 0:
strcpy (bQuotesmem
->data0
, szBuffer
); break;
case 1:
strcpy (bQuotesmem
->data1
, szBuffer
); break;
case 2:
bQuotesmem
->data2
=atof(szBuffer
); break;
case 3:
bQuotesmem
->data3
=atof(szBuffer
); break;
case 4:
bQuotesmem
->data4
=atof(szBuffer
); break;
case 5:
bQuotesmem
->data5
=atof(szBuffer
); break;
case 6:
bQuotesmem
->data6
=atof(szBuffer
); break;
}
}
if (i<MTFMT_CSV_QUOTEN)
{
return MTERR_QUOTEN_DOESNT_MATCH;
}
//fgetpos(csvheader->hFile, &(csvheader->fpos));
return 0;
}
Por lo que podran deducir el archivo en cuestion es un CSV con nueve columnas (Y en este caso el archivo tiene 11.352.960.000 filas).
La estructura __quotesmem es simplemente una estructura en RAM en la que ordeno los datos para poder manejarlos luego.
Cabe mencionar que:
La estructura es una lista enlazada, por lo que por cada fila nueva llama a malloc. ¿Es malloc una funcion lenta? Porque de ser asi puede estar ahi el problema la verdad...
La funcion es llamada cuantas veces sea necesario hasta que retorne final del archivo MTERR_CSV_EOF.
Importante tomar en cuenta: Para cuando se llama esta funcion el contenido del archivo ya esta en memoria RAM. Se encuentra todo en csvheader->bBuffer.
Nota: Hay cadenas comentadas porque solia usar esta funcion accediendo a cada caracter individual del archivo, lo cual.... jajajaja... eso si se tardaba un buen rato. Cuarenta minutos es muy poco en comparacion. Aun asi me parece mejorable por eso hago este tema, porque ni siquiera creo que este calculando algo innecesariamente aqui. Insisto en que tal vez sean las tantas llamadas a malloc...
Eternal Idol, el programa usa siempre el mismo porcentaje de la CPU. Lo que cambia es el acceso a memoria. Si pongo en el codigo un printf("%d/%d\r", csvheader->fpos, csvheader->fsize); Puedo ver como los primeros cientos de miles de bytes se cargan rapidamente, y luego va disminuyendo la velocidad de carga. El porcentaje de uso del procesador esta siempre igual (en torno a un 15%). Lo que va disminuyendo es la velocidad de acceso a la memoria RAM.