Salut,
J'ai écrit du code pour implémenter une table de recherche rudimentaire pour un ensemble de données tension/temps. Mais en raison de la taille de mon ensemble de données, celui-ci se bloque.
Contexte rapide, il peut y avoir environ 1 000 lignes (intervalles de temps) pour chaque exécution et il y a environ 1 500 exécutions, soit 1,5 million de lignes au total. En un mot, je fais ce qui suit dans mon code avant de commencer à utiliser la table de recherche :
- Ensemble de données de processus
- Calculer dV/dt à partir des données
- Utilisez tabulate pour trouver le pic dV/dt pour chaque analyse individuelle et créez un nouveau tableau de données appelé dt2.
- Créez une nouvelle colonne dans l'ensemble de données pour écrire la valeur maximale dV/dt à côté de chaque valeur dV/dt dans chaque analyse.
À ce stade, mon code commence à parcourir ligne par ligne via dt1, en vérifiant les différents paramètres de test qui définissent le # exécuté sur dt2, en trouvant le pic dV/dt et en le renvoyant à cette ligne dans dt1.
Mon code pour rechercher la table de recherche ressemble à ceci :
Current Data Table( dt1 );<BR /><BR />For Each Row(
v = :sample;
w = :temp;
x = :cell;
y = :vicl;
z = :v_bg;<BR />// Find the row in dt2 that matches v/w/x/y/z
row = dt2 << get rows where( :sample == v & :temp == w & :cell == x & :vicl == y & :v_bg == z);<BR />// get values from the dV/dt peak column in dt2
col = Column(dt2, "dvdt_abs_max") << getValues;<BR />// pick out the value of row[n] from that column and save into the active row in dt1
:dVdt_peak = col[row]
);
Ce code a fonctionné lorsque je l'ai testé sur un petit ensemble, mais une fois que j'ai eu mon ensemble de données complet, le rouet infini est apparu. Je suis assez nouveau dans ce domaine et je suis sûr qu'il doit y avoir une meilleure façon, plus efficace, de le faire, je ne l'ai tout simplement pas compris.
Merci
Merci pour le pointeur @David_Burnham , je m'en souviendrai la prochaine fois que j'utiliserai « Pour chaque ligne ».
Cette fonction est exactement ce que je recherchais. Merci @txnelson !
Voir @txnelson , mais notez également que même si « For Each Row » est agréable à écrire, mon expérience est qu'il s'exécute très lentement.Une boucle for standard, c'est-à-dire 'For (i=1,i<=nrows(dt),i++', est une méthode beaucoup plus rapide pour parcourir les lignes d'une table.
Vous obligez vraiment JMP à faire cela à la dure.Le moyen le plus simple et le plus efficace de gérer cela consiste à utiliser la plateforme de mise à jour.Il devrait gérer votre recherche sur 1,5 million de lignes sans problème
dt << Update(
With( dt2 ),
Match Columns( :sample == :sample, :temp == :temp, :cell == :cell, :vicl == :vicl, :v_bg == :v_bg ),
Add Columns from Update Table( :dvdt_abs_max )
);
Rapidement, si cela peut aider, la raison de ce code est que je peux filtrer et supprimer des lignes selon qu'elles tombent en dessous d'un certain seuil fonction du pic dV/dt.