Il salvataggio nel database è troppo lento (10.000 record al minuto)<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho una tabella JMP con 270.000 record e 72 colonne.
Sto cercando di salvarlo in un database tramite ODBC ma il processo è terribilmente lento: sono circa 10.000 record al minuto (sì, al minuto, non è un errore di battitura).
Ho provato ad esportare sia su un server Microsoft SQL Server 2014 che su un server PostgreSQL 9.3: la velocità (o la sua mancanza...) è la stessa in entrambi i casi. Inoltre, entrambi i server si trovano nello stesso edificio della workstation da cui eseguo JMP. Sono l'unico utente con accesso ai due server, quindi so che non sono occupati con nient'altro.
Ho pensato che la bassa velocità potesse essere dovuta al fatto che JMP cercava di calcolare la lunghezza dei campi di testo, quindi ho rimosso tutte le colonne di testo e lasciato solo i campi numerici, ma la velocità è la stessa.
Se recupero una tabella di dimensioni simili da uno dei database tramite ODBC, ci vogliono meno di 20 secondi.
Gli strumenti ETL che scrivono sui due database tramite ODBC o JDBC sono molto più veloci.
Qualche idea su come potrei rendere più veloce la scrittura nei database? Al momento la funzione è così lenta da essere praticamente inutilizzabile.
Grazie.
Ri: Il salvataggio nel database è troppo lento (10.000 record al minuto)Sono stati apportati alcuni miglioramenti in JMP 13 riguardanti l'interazione del database.Uno di questi è l'opzione Database>Salva tabella.
In JMP 13, ora vengono inserite più righe (Inserimento in blocco) per i database che lo supportano (che sono la maggior parte di essi).I miglioramenti all'interazione del database JMP 13 includono anche la conservazione dei nomi delle colonne e delle maiuscole e minuscole (quando possibile), nonché la conservazione delle informazioni TIMESTAMP.
Ri: Il salvataggio nel database è troppo lento (10.000 record al minuto)Non ho mai utilizzato l'opzione Database>Salva tabella.In realtà non sapevo che esistesse finché non ho letto questo post, quindi ho scritto un sacco di funzioni personali per attività comuni.Anche se sento che sono lenti, almeno possono vantare velocità migliori di qualsiasi altra cosa in questo thread.
Ecco la mia funzione BulkInsert:
//Inserisci tabella nel database..Table --assume corrispondenze ncols
Inserimento in blocco = funzione ({ db , dbTable , dt } , { Locale predefinito } ,
//db - connessione al database
//dbTable = tabella del database
//dt - tabella dati JMP
numCol = NCol ( dt ) ;
numRighe = NRighe ( dt ) ;
per ( io = 1 , io <= numRighe , io ++,
valoriLista = {} ;
per ( J = 1 , J <= numCol , J ++,
Se ( isDate ( colonna ( dt , J )) ,
inserire ( valoriLista , car ( Formato ( colonna ( dt , J )[ io ] , "ddMonyyyy h:m:s" )))
,
inserire ( valoriLista , colonna ( dt , J )[ io ])
) ;
) ;
valoriTesto = sostituire ( car ( valoriLista ) , "{" , "(" , "}" , ")" , "\!"" , "'" ) ;
Sostituisci in ( valoriTesto , "." , "NULLO," ) ;
stringa_SQL = "Inserire " || dbTable || "\!N" ||
"Valori " || valoriTesto ;
Esegui SQL ( db , stringa_SQL ) ;
) ;
) ;
Avrai bisogno della funzione isDate che ho scritto e che puoi trovare qui: Esiste un modo semplice per sapere se una colonna è Data/Ora?
Oppure puoi commentare quella parte del codice se non hai colonne data/ora.
Ri: Il salvataggio nel database è troppo lento (10.000 record al minuto)Ora è l'anno 2016 e diverse versioni successive. E posso confermare la lentezza, ma nel mio caso ottengo 200 record al minuto. Avendo 16.064.704 record, ci vorranno 2 mesi prima di inviarli al database. Il pulsante Annulla non funziona e l'unica via d'uscita è interrompere il processo.
Per favore, fai qualcosa al riguardo: con così tanto margine di miglioramento, non dovrebbe essere così difficile!
Ri: Il salvataggio nel database è troppo lento (10.000 record al minuto)
BrianCorcoran wrote:
The emphasis in JMP development has been on getting data into the product. We have put considerable time into getting "block" fetching mechanisms working for Open Table, but we do not have a similar mechanism for Save Table. We have an open request to do this, but cannot commit to a specific implementation date.
Brian Corcoran
il che significa effettivamente che l'opzione "salva nel database" è assolutamente inutile per tabelle con più di qualche migliaio di record. Se solo le specifiche di questo costoso software fossero più chiare...
Ri: Il salvataggio nel database è troppo lento (10.000 record al minuto)L'enfasi nello sviluppo di JMP è stata posta sull'inserimento dei dati nel prodotto.Abbiamo dedicato molto tempo a far funzionare i meccanismi di recupero dei "blocchi" per Open Table, ma non disponiamo di un meccanismo simile per Save Table.Abbiamo una richiesta aperta per farlo, ma non possiamo impegnarci per una data di implementazione specifica.
Brian Corcoran
Ri: Il salvataggio nel database è troppo lento (10.000 record al minuto)
PMroz wrote:
You could export the JMP dataset to a csv file, and then use the SQL Server bulk insert functionality. A bit of a kluge but it should be much faster.
Grazie. In effetti avevo provato qualcosa di simile. Tuttavia, mi piacerebbe davvero sapere se esiste un modo per rendere il "salvataggio nel database" più veloce, cioè fattibile, dato che in questo momento è così lento da essere inutilizzabile.
Ha qualcosa a che fare con le impostazioni/driver ODBC (ma JMP è veloce nel recuperare i dati dai database) o è proprio così che funziona JMP?
Ri: Il salvataggio nel database è troppo lento (10.000 record al minuto)È possibile esportare il set di dati JMP in un file CSV e quindi utilizzare SQL Server inserto sfuso funzionalità.Un po' complicato ma dovrebbe essere molto più veloce.