close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Closed 14 years ago

#961 closed defect (fixed)

BDTFile não funciona

Reported by: efujimoto Owned by: Víctor de Buen Remiro
Priority: highest Milestone: Mantainance
Component: ASCII data files Version:
Severity: blocker Keywords:
Cc:

Description (last modified by Víctor de Buen Remiro)

Estou com o seguinte problema, tento gravar um Set de 700.000 linhas (um exemplo pode ser gerado pelo código abaixo):

Set segmentos = [[ [["co_cliente";"id_cluster";"dt_inicio";"dt_fim"]] ]]<<
   For(1, 700000, Set(Real x){
     [[IntText(x), IntText(x), IntText(x), IntText(x)]]
   })

Se eu tento gravar usando BDTFile, um set com a mesma quantidade de linhas me é retornado, mas nenhum arquivo é gravado.

Se eu tento com o código abaixo, após um tempo o tol cai.

Text tempFile = "C:/TempFileCluster.txt";
Text WriteFile(tempFile, "co_cliente;id_cluster;dt_inicio;dt_fim"+NL);
Set EvalSet (Segmentos.T, Text (Set line){
  AppendFile(tempFile, TxtListItem(line, ";")+NL)
});

Change History (4)

comment:1 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)
Status: newaccepted

comment:2 Changed 14 years ago by Víctor de Buen Remiro

Milestone: Mantainance

La función BDTFile es para almacenar un conjunto de series temporales, por eso no guarda nada. Lo que sí es cierto es que debería dar un mensaje de aviso cuando no se le pasan argumentos adecuados.

Para guardar tablas (conjuntos de conjuntos) se usa la función BSTFile. Yo he probado con BSTFile y me funciona, aunque está claro que el consumo de memoria es bastante grande. Si a tí no te funciona con este cambio veremos de buscar alguna solución.

El problema de que se caiga TOL por un uso intensivo de AppendFile no lo había visto nunca y habrá que ver si es posible arreglarlo, pero en estos casos masivos en lo que no se precisa el resultado del ciclo, es mucho más recomendable usar While que For, pues el While libera mejor la memoria al no tener que retornar nada. Si lo piensas en cada iteración del For estás devolviendo el camino del archivo que es lo que retorna el AppendFile, es decir, estas formando un conjunto de 700000 réplicas de un mismo texto que no necesitas para nada, consumiendo memoria sin hacer uso de ella.

También existen una serie de funciones de más bajo nivel para acceso de lectura y escritura de ficheros ASCII, que se llaman FOpen, FClose, FEof, FFlush, FPutText, FGetText que permiten mantener un fichero abierto y hacer un gran número de operaciones, mientras que AppendFile abre y cierra el archivo cada vez lo cual carga mucho el sistema operativo y puede dar lugar incluso a fallos de disco.

Gracias por poner el ticket, has descubierto al menos un par de fallos gracias a tu confusión de usar una función por otra. Siempre hay que ver el lado positivo.

Consejo: cuando una función falla lo primero que se debe hacer es consultar su descripción y si no se entiende, ya que muchas no están bien documentadas lo mejor es poner un ticket.

comment:3 Changed 14 years ago by Víctor de Buen Remiro

Summary: DBTFile não funcionaBDTFile não funciona

comment:4 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: acceptedclosed
Note: See TracTickets for help on using tickets.