Gran bola de nieve que me colapsa todo.

Soy nuevo en Delphi-Cbuilder, Estoy haciendo programa que para migrar
o transferir diariamente 400mil registros desde un servidor D3
a MySQL.
El problema esta en que cuando el programa llega a los 100mil
registros la memoria virtual del PC se satura y la velocidad
cae drásticamente, sin contar que después colapsa todo.
No se porque el programa página demasiada memoria virtual
se supone que una vez transferido el registro al mysql
debería borrarlo de la memoria o algo parecido.
Mi pregunta es si hay forma que mi programa libere memoria
virtual progresivamente, para no dejar que se forme esa
gran bola de nieve que me colapsa todo.

1 respuesta

Respuesta
1
Dime más o menos como estas haciendo la transferencia de información. ¿Y qué es un servidor D3?.
Ya pude resolver, lo que pasaba era que yo creaba y destruía varias veces una clase, esta clase es la que se encarga de crear la instrucción SQL para la inserción de los registros en MySQL.
En ves de crear y destruirla decidí reutilizarla y destruirla al final.
Sin embargo me quedo una duda: por que C++Builder cuando le digo que destruya la clase, en ves de liberarla totalmente de la memoria lo que hace es quitarla de la RAM y pasarla para la Memoria Virtual como si esta fuese un pote de basura para las clases que mando a destruir, ¿Exite alguna forma de destruir la clase en su totalidad? O ¿Decirle a C++Builder que limpie la Memoria Virtual?
El D3 de? ¿Raining Data? Es un sistema propietario de Base de Datos y lenguaje de programación, se parece al dbase pero en una mayor escala, normalmente se usa para hacer sistemar administrativos grandes o sistemas bancarios.
Aquí esta la clase que uso y el código que muestra como la creaba y la destruía varias veces.
class TinsertaValores {
AnsiString *par, *val;
AnsiString mitexto;
int tam, i;
public:
TinsertaValores(int t){
i=0;
tam = t;
par = new AnsiString[t];
val = new AnsiString[t];
}
~TinsertaValores(){
delete par;
delete val;
}
void parametros(AnsiString p, AnsiString v){
if (v.Length()<= 0){v="NULL";}
v = AnsiReplaceText(v,"'"," ");
par=p; val=v;
i++;
}
void text(AnsiString t){
mitexto = t;
}
AnsiString text(){
return mitexto;
}
void limpia(){
int j;
for (j=0; j < tam; j++){
par[j]=NULL;
val[j]=NULL;
}
i=0;
}
void remplasar(){
int j;
for (j=0; j < i; j++){
mitexto = AnsiReplaceText(mitexto,par[j],val[j]);
}
}
};
//////////////////////////////////////////////////////////
while (QD3->Eof==false) {
TinsertaValores RV(20); /// codigo para crear la clase
RV.text(sqlRows);
RV.parametros("amo_inst",AnsiReplaceText(Trim(QD3->FieldByName("amo_inst")->AsString),",","."));
RV.parametros("amo_plaz",AnsiReplaceText(QD3->FieldByName("amo_plaz")->AsString,",","."));
RV.parametros("amo_deud",AnsiReplaceText(QD3->FieldByName("amo_deud")->AsString,",","."));
RV.parametros("amo_tipc",AnsiReplaceText(QD3->FieldByName("amo_tipc")->AsString,",","."));
*
*
*
*
RV.remplasar();
*sqlInsert = *sqlInsert + RV.text() + ",";
RV.~TinsertaValores(); /// codigo para destruir la clase
}
Gracias por atenderme!
Ya pude resolver, lo que pasaba era que yo creaba y destruía varias veces una clase
Esta clase es la que se encarga de crear la instrucción SQL para la inserción de los registros.
En ves de crear y destruirla decidí reutilizarla y destruirla hasta el final.
Sin embargo me quedo una duda: por que en C++Builder cuando le digo que destruya la clase, en ves de liberarla totalmente de la memoria lo que hace es quitarla de la RAM y pasarla para la Memoria Virtual como si esta fuese un pote de basura para las clases que mando a destruir, ¿Exite alguna forma de destruir la clase en su totalidad? O ¿Decirle a C++Builder que limpie la Memoria Virtual?
Yo creo la clase con: TinsertaValores RV(20);
Y las destruyo con: RV. ~TinsertaValores();
Soy nuevo en esto y no se si la estoy usando el método equivo cado para realmente destruir la clase.
Aquí esta la clase que uso y el código que muestra como la creaba y la destruía
Muchas gracias por atenderme!
class TinsertaValores {
AnsiString *par, *val;
AnsiString mitexto;
int tam, i;
public:
TinsertaValores(int t){
i=0;
tam = t;
par = new AnsiString[t];
val = new AnsiString[t];
}
~TinsertaValores(){
delete par;
delete val;
}
void parametros(AnsiString p, AnsiString v){
if (v.Length()<= 0){v="NULL";}
v = AnsiReplaceText(v,"'"," ");
par=p; val=v;
i++;
}
void text(AnsiString t){
mitexto = t;
}
AnsiString text(){
return mitexto;
}
void limpia(){
int j;
for (j=0; j < tam; j++){
par[j]=NULL;
val[j]=NULL;
}
i=0;
}
void remplasar(){
int j;
for (j=0; j < i; j++){
mitexto = AnsiReplaceText(mitexto,par[j],val[j]);
}
}
};
//////////////////////////////////////////////////////////
while (QD3->Eof==false) {
TinsertaValores RV(20); /// codigo para crear la clase
RV.text(sqlRows);
RV.parametros("amo_inst",AnsiReplaceText(Trim(QD3->FieldByName("amo_inst")->AsString),",","."));
RV.parametros("amo_plaz",AnsiReplaceText(QD3->FieldByName("amo_plaz")->AsString,",","."));
RV.parametros("amo_deud",AnsiReplaceText(QD3->FieldByName("amo_deud")->AsString,",","."));
RV.parametros("amo_tipc",AnsiReplaceText(QD3->FieldByName("amo_tipc")->AsString,",","."));
*
*
*
*
RV.remplasar();
*sqlInsert = *sqlInsert + RV.text() + ",";
RV.~TinsertaValores(); /// codigo para destruir la clase
}
Sabes una cosa, no se mucho de C++Builder, soy experto en Delphi.
Pero en delphi, las clases las destruyo así:
MyClase.Free; no se si en c++Builder exista algo asi.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas