Comportamento del ciclo molto lentoHo una domanda riguardo al tempo trascorso nei loop.
Sto analizzando quantità maggiori di dati di produzione, in genere 1 milione di righe.
Per ogni riga, la produzione acquisisce lo stato (colonna Statusnummer).
Se lo stato è "1", vorrei calcolare i valori per l'effettivo ("ist") e il valore impostato ("soll").
Quindi ho bisogno di calcolare 1 milione di righe. Lo sto facendo molte volte nel mio codice, per valori diversi.
A volte i loop sono veloci (60 secondi), a volte sono molto (!) lenti (più di un giorno! Il processore funziona ancora a pieno carico!).
Tutte le colonne sono impostate su numerico e continuo, ma non riesco a capire perché alcuni cicli sono molto lenti.
Ho anche controllato se la cella contiene valori mancanti (vedi codice di esempio); Tuttavia il codice rimane lento.
Qualche idea, cosa sto facendo di sbagliato?
Martora
Esempio del codice, che è lento:
for(i=1,i<=NRows(dt),i++,(
if(dt:Statusnummer[i] == 1,(
if(!isMissing(dt:Drehzahl[i]) & !isMissing(dt:geschw[i]) ,(
ist = dt:Drehzahl[i];
soll = dt:SollDrehzahl[i];
dt:Soll_drehzahl[i] = soll;
dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;
));
));
));
Ri: Comportamento del ciclo molto lento@vince_faller Freddo! Vedo solo circa 10 volte più veloce (il che è ancora piuttosto sorprendente). Sospetto che questo aumento di velocità non sia correlato all'aggiornamento dei dati di inizio/fine, ma penso anche che le assegnazioni della matrice faranno qualcosa come l'aggiornamento dei dati di inizio/fine internamente.
@EvanMcCorkle
Ri: Comportamento del ciclo molto lentoGrazie, probabilmente (vedi commento sopra, il problema nel frattempo è svanito) questo era il motivo,visto che molte segnalazioni erano aperte. Ma non posso riprodurmi in questo momento. Introdurrò la tua soluzione nel mio codice e vedrò se è la soluzione permanente.
MartoraRi: Comportamento del ciclo molto lentoAggiornamento : ho aggiunto il metodo get rows where per trovare le righe.Ovviamente questo ha la restrizione di richiedere dati numerici, ma a volte riesco ad aggirarlo.
Sono un grande fan di fare tutto con le matrici.
Names default to here(1);
dt = New Table("Test",
Add Rows(1000000),
New Column("Statusnummer", Set Each Value(Random Integer(0, 1))),
New Column("Drehzahl", Set Each Value(Choose(Random Integer(1, 2), ., Random Normal()))),
New Column("geschw", Set Each Value(Choose(Random Integer(1, 2), ., Random Normal()))),
New Column("SollDrehzahl", Set Each Value(Random Normal())),
New Column("Soll_drehzahl"),
New Column("Ist_drehzahl"),
New Column("Maschinenleistung"),
);
st = HPTime();
for(i=1,i<=NRows(dt),i++,
if(dt:Statusnummer[i] == 1,
if(!isMissing(dt:Drehzahl[i]) & !isMissing(dt:geschw[i]),
ist = dt:Drehzahl[i];
soll = dt:SollDrehzahl[i];
dt:Soll_drehzahl[i] = soll;
dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;
);
);
);
t_loop = HPTime() - st;
st = HPTime();
m = dt[0, {"Statusnummer", "Drehzahl", "geschw"}]; // makes a matrix
//check the matrix
v = m[0, 1] // don't need to do a check if it's 0 or 1
&
!ismissing(m[0, 2]) // check if drehzahl is missing
&
!ismissing(m[0, 3]); // check if drehzahl is missing
rows = loc(v); // this is the rows you want to do stuff on now.
//now just set all at once
soll = dt[rows, "Soll_drehzahl"] = dt:SollDrehzahl[rows]; // assign the rows and variable simultaneously
ist = dt[rows, "Ist_drehzahl"] = dt:Drehzahl[rows]; // same thing
dt[rows, "Maschinenleistung"] = 100 * ist :*</img> (1/soll); // do an element wise matrix division
t_mat = HPTime() - st;
st = HPTime();
rows = dt << get rows where(dt:Statusnummer == 1 &
!Is Missing(dt:Drehzahl) &
!Is Missing( dt:geschw ));
//now just set all at once
soll = dt[rows, "Soll_drehzahl"] = dt:SollDrehzahl[rows]; // assign the rows and variable simultaneously
ist = dt[rows, "Ist_drehzahl"] = dt:Drehzahl[rows]; // same thing
dt[rows, "Maschinenleistung"] = 100 * ist :*</img> (1/soll); // do an element wise matrix division
t_get_where = HPTime() - st;
show(t_loop, t_mat, t_get_where);
Quando ho eseguito questo confronto, ho ottenuto
t_loop = 11259288;
t_mat = 206942;
Aggiornato
t_loop = 11950585;
t_mat = 205366;
t_get_where = 6742823;
Ri: Comportamento del ciclo molto lentoCiò potrebbe accelerare le cose: limitare il ciclo alle sole righe che soddisfano le tue condizioni.
found_rows = dt << get rows where(dt:Statusnummer == 1 &
!Is Missing(dt:Drehzahl) &
!Is Missing( dt:geschw ));
for (i = 1, i <= nrows(found_rows), i++,
k = found_rows[i];
dt:Soll_drehzahl[k] = dt:SollDrehzahl[k];
dt:Ist_drehzahl[k] = dt:Drehzahl[k];
dt:Maschinenleistung[k] = 100 * dt:Ist_drehzahl[k] / dt:Soll_drehzahl[k] ;
);Ri: Comportamento del ciclo molto lentoForse hai un altro rapporto che è aperto e si aggiorna per ogni modifica apportata alla tabella. Potresti farlo prima e dopo il tuo ciclo:
dt << Begin Data Update;
// the loop
dt << End Data Update;
Ri: Comportamento del ciclo molto lento|Ciao Ron, grazie. I cicli nidificati hanno lo scopo di renderlo più veloce,
perché la prima condizione non riesce in molte righe, in modo tale che il ciclo può
(e fa) inizia dall'alto usando la riga successiva. quindi dalla funzionalità
tutto funziona. Tuttavia, ho ricontrollato, dove diventa lento. Nel
debugger, l'accesso alla tabella dati per riscrivere i valori ha richiesto molto tempo:
dt:Soll_drehzahl[i] = soll; dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;|
Quindi li ho commentati (//) ==> risultato: molto veloce
Ho cancellato i segni di commento (//) e..... ancora molto velocemente (!)
.......(Stesso codice, stessa struttura,....)
Quindi ora funziona, ma non so ancora cosa abbia causato il problema. Forse
qualcosa nel mio sistema è corrotto.
Grazie per i suggerimenti.
Ri: Comportamento del ciclo molto lentoCIAO @M Walther
Proverei a farlo come suggerito da Jeff usando le formule di colonna. non dimenticare che puoi sempre rimuovere le formule o semplicemente sopprimere le loro valutazioni una volta che non vuoi che vengano costantemente rivalutate.
se insisti nell'usare il metodo del ciclo for, vedrei prima se sono necessari gli ultimi punti e virgola.
inoltre, proverei a semplificare l'istruzione if nidificata in un elenco più lungo di condizioni.
infine, usando il de bugger su un sottocampione e vedi cosa nel ciclo richiede più tempo. Ho la sensazione che stia facendo qualcosa di non intenzionale che richiede la maggior parte del tempo.
facci sapere se qualcosa migliora.
Ri: Comportamento del ciclo molto lentoCaro Jeff, grazie per la risposta. Formule in quel punto della sceneggiatura
non aiutare. (Questa è la mia sezione di ordinamento e pulizia dei dati, dove voglio
per evitare formule)
Sto correndo allo stesso problema in posti diversi. E alcune formule
sono stati colpiti pure.
Sembra che il processo si stia bloccando quasi completamente (ho contato 1
riga/secondo!) anche se la CPU continua con il carico!
Il risultato è comunque corretto, una volta terminato.
Tua Marten
Ri: Comportamento del ciclo molto lentoHai provato a costruire quelle colonne nella tabella dei dati usando il file Editor di formule invece di eseguire il looping con JSL? Potrebbe essere più efficiente.