Économisez de la mémoire lors de la concaténation verticale en boucleSalutations!
J'essaie de concaténer les résultats de requêtes de plusieurs tables d'un répertoire en une seule table. J'utilise une boucle pour lire/interroger les tables et concaténer les résultats. La table de résultats est correcte mais chaque table concaténée intermédiaire continue de s'ouvrir en consommant de la mémoire.
Merci pour toute suggestion visant à éviter d'ouvrir chaque tableau de résultats intermédiaire mais simplement à mettre à jour le bloc de données qui ne peut être affiché comme tableau de résultats qu'une fois la boucle terminée.
J'utilise JMP 17 Pro.
names default to here(1);<BR />dirLoc=Pick Directory("Select a directory", "myDirectory\");
fileList = Files In Directory(dirLoc);
dt1 = open(dirLoc || fileList[1]);
dt1 << Select Where( :Amount >= 500 );
x=dt1 << Subset ( Output Table Name("T1") );
Close(dt1, NoSave);
For(i = 2, i <= N Items( fileList ), i++,
dt = open(dirLoc || fileList[i] );
dt << Select Where( :Amount >= 500 );
y = dt << Subset ( Output Table Name("Temp"));
x = x << Concatenate( y);
Close(dt, NoSave);
Close(y, NoSave);
);
result = x<<SUBSET></SUBSET>
<LINGO-LABS id="lingo-labs-718508" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisation et scripts</LINGO-LABEL></LINGO-LABS>Re : Économiser de la mémoire lors de la concaténation verticale en boucleThere might be some misunderstanding here. Doing x << Concatenate( x, y ) will not update x, it will create a new table.
To update x with the values of y, use the literal expression x << Concatenate( y, "Append to First Table" )
Pensez également à faire tout cela sous forme de tables privées pour conserver les ressources, puis à la fin, affichez la table, comme ceci :
Names Default To Here( 1 );
dirLoc = Pick Directory( "Select a directory", "myDirectory\" );
fileList = Files In Directory( dirLoc );
dt1 = Open( dirLoc || fileList[1], Private );
dt1 << Select Where( :Amount >= 500 );
x = dt1 << Subset( Output Table Name( "T1" ), Private );
Close( dt1, NoSave );
For( i = 2, i <= N Items( fileList ), i++,
dt = Open( dirLoc || fileList[i], Private );
dt << Select Where( :Amount >= 500 );
y = dt << Subset( Output Table Name( "Temp" ), Private );
x << Concatenate( y, "Append to First Table" );
Close( dt, NoSave );
Close( y, NoSave );
);
x << Set Name( "Result" );
x << New Data View;
Re : Économiser de la mémoire lors de la concaténation verticale en boucleMerci pour votre suggestion d'ajouter au lieu de concaténer. En fait, j'ai essayé d'ajouter ainsi que indiqué ci-dessous. Le problème est qu'il affiche toute la table intermédiaire à chaque fois qu'elle est ajoutée à la boucle.
x << Concatenate(x,y);
Toute pensée?
Re : Économiser de la mémoire lors de la concaténation verticale en boucleVous devez ajouter les tables concaténées. Par défaut, JMP concatène les tables en une nouvelle table.
names default to here(1);dirLoc=Pick Directory("Select a directory", "myDirectory\");
fileList = Files In Directory(dirLoc);
dt1 = open(dirLoc || fileList[1]);
dt1 << Select Where( :Amount >= 500 );
x=dt1 << Subset ( Output Table Name("T1") );
Close(dt1, NoSave);
For(i = 2, i <= N Items( fileList ), i++,
dt = open(dirLoc || fileList[i] );
dt << Select Where( :Amount >= 500 );
y = dt << Subset ( Output Table Name("Temp"));
x << Concatenate( y, "Append to First Table" );
Close(dt, NoSave);
Close(y, NoSave);
);
result = x<<SUBSET></SUBSET>