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 )
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
Description: | modified (diff) |
---|---|
Status: | new → accepted |
comment:2 Changed 14 years ago by
Milestone: | → Mantainance |
---|
comment:3 Changed 14 years ago by
Summary: | DBTFile não funciona → BDTFile não funciona |
---|
comment:4 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
Note: See
TracTickets for help on using
tickets.
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.