L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai une table JMP avec 270 000 enregistrements et 72 colonnes.
J'essaie de l'enregistrer dans une base de données via ODBC mais le processus est terriblement lent : il s'agit d'environ 10 000 enregistrements par minute (oui, par minute, ce n'est pas une faute de frappe).
J'ai essayé d'exporter à la fois vers un serveur Microsoft SQL Server 2014 et PostgreSQL 9.3 : la vitesse (ou son absence...) est la même dans les deux cas. De plus, les deux serveurs se trouvent dans le même bâtiment que le poste de travail à partir duquel j'exécute JMP. Je suis le seul utilisateur ayant accès aux deux serveurs, je sais donc qu'ils ne sont occupés par rien d'autre.
Je pensais que la vitesse lente pourrait être due au fait que JMP essayait de déterminer la longueur des champs de texte. J'ai donc supprimé toutes les colonnes de texte et laissé uniquement les champs numériques, mais la vitesse est la même.
Si je récupère une table de taille similaire à partir de l'une ou l'autre base de données via ODBC, cela prend moins de 20 secondes.
Les outils ETL écrivant dans les deux bases de données via ODBC ou JDBC sont beaucoup plus rapides.
Avez-vous des idées sur la manière dont je pourrais accélérer l'écriture dans les bases de données ? Pour l’instant, la fonction est si lente qu’elle est pratiquement inutilisable.
Merci.
Re : L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)De nombreuses améliorations ont été apportées à JMP 13 concernant l'interaction avec les bases de données.L’une d’elles est l’option Base de données> Enregistrer la table.
Dans JMP 13, plusieurs lignes sont désormais insérées (Bulk Insert) pour les bases de données qui le supportent (qui sont la plupart d'entre elles).Les améliorations apportées à l'interaction avec la base de données JMP 13 incluent également la préservation des noms de colonnes et de la casse (si possible), ainsi que la préservation des informations TIMESTAMP.
Re : L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)Je n'ai jamais utilisé l'option Base de données> Enregistrer la table.En fait, je ne savais pas que cela existait avant de lire cet article, j'ai donc écrit un certain nombre de mes propres fonctions de tâches courantes.Même si je pense qu'ils sont lents, ils peuvent au moins se vanter d'avoir des vitesses meilleures que tout ce qui se trouve dans ce fil.
Voici ma fonction BulkInsert :
//Insérer une table dans la base de données..Table --suppose des correspondances ncols
Insertion en bloc = fonction ({ base de données , table de base de données , dt } , { Local par défaut } ,
//db - connexion à la base de données
//dbTable = table de base de données
//dt - Table de données JMP
numCols = NCcols ( dt ) ;
nombre de lignes = Lignes ( dt ) ;
pour ( je = 1 , je <= nombre de lignes , je ++,
Liste de valeurs = {} ;
pour ( j = 1 , j <= numCols , j ++,
Si ( estDate ( colonne ( dt , j )) ,
insérer dans ( Liste de valeurs , carboniser ( Format ( colonne ( dt , j )[ je ] , "jjMonyyyy h:m:s" )))
,
insérer dans ( Liste de valeurs , colonne ( dt , j )[ je ])
) ;
) ;
valeursTexte = remplaçant ( carboniser ( Liste de valeurs ) , "{" , "(" , "}" , ")" , "\!"" , "'" ) ;
Remplacer par ( valeursTexte , ".," , "NUL," ) ;
Chaîne_SQL = "Insérer dans " || table de base de données || "\!N" ||
"Valeurs " || valeursTexte ;
Exécuter SQL ( base de données , Chaîne_SQL ) ;
) ;
) ;
Vous aurez besoin de la fonction isDate que j'ai écrite et que vous pouvez trouver ici : Existe-t-il un moyen simple de savoir si une colonne est Date/Heure ?
Ou vous pouvez commenter cette partie du code si vous n'avez pas de colonnes date/heure.
Re : L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)Nous sommes maintenant en 2016 et plusieurs versions plus tard. Et je peux confirmer la lenteur, mais dans mon cas j'obtiens 200 enregistrements par minute. Disposant de 16.064.704 enregistrements, il faudra compter 2 mois avant de les soumettre à la base de données. Le bouton Annuler ne fonctionne pas et la seule issue est de tuer le processus.
S'il vous plaît, faites quelque chose – avec tant de choses à améliorer, cela ne devrait pas être si difficile !
Re : L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)
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
ce qui signifie effectivement que l'option « enregistrer dans la base de données » est totalement inutile pour les tables de plus de quelques milliers d'enregistrements. Si seulement les spécifications de ce logiciel coûteux étaient plus claires...
Re : L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)Dans le développement de JMP, l'accent a été mis sur l'intégration des données dans le produit.Nous avons consacré beaucoup de temps à faire fonctionner les mécanismes de récupération de « blocs » pour Open Table, mais nous n'avons pas de mécanisme similaire pour Save Table.Nous avons une demande ouverte pour ce faire, mais nous ne pouvons pas nous engager sur une date de mise en œuvre précise.
Brian Corcoran
Re : L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)
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.
Merci. J'avais en fait essayé quelque chose de similaire. Cependant, j'aimerais vraiment savoir s'il existe un moyen de rendre la « sauvegarde dans la base de données » plus rapide, c'est-à-dire réalisable, car pour le moment, c'est si lent qu'il est inutilisable.
Est-ce quelque chose à voir avec les paramètres/pilotes ODBC (mais JMP récupère rapidement les données des bases de données), ou est-ce simplement le cas de JMP ?
Re : L'enregistrement dans la base de données est trop lent (10 000 enregistrements par minute)Vous pouvez exporter l'ensemble de données JMP vers un fichier csv, puis utiliser SQL Server insert en vrac Fonctionnalité.Un peu compliqué mais ça devrait être beaucoup plus rapide.