J'utilise Générateur de requêtes et Fichier -> Se connecter à -> ODBC -> Ouvrir une table de base de données pour récupérer des données d'une base de données PostgreSQL.
Le tableau que je récupère de la base de données contient une colonne avec de longues chaînes de caractères.
Mes chaînes de texte sont tronquées lorsqu'elles dépassent une longueur de 524 587. (2^19 -1)
Existe-t-il un paramètre dans JMP et/ou JSL que je peux modifier pour activer l'interrogation de valeurs de chaîne plus longues ?
Situation motivante et résultats du débogage
J'ai exploré les capacités du module complémentaire Torch Deep Learning .
J'ai téléchargé un ensemble de données Kaggle sur le thème Chiens contre Loups .
J'ai utilisé la fonction Importer plusieurs fichiers JMP pour créer une table de données qui contient tous ces fichiers (2000 fichiers).
J'ai utilisé JMP pour nettoyer les données, créer une colonne de réponse, des colonnes de validation, etc.
J'ai créé une base de données PostgreSQL, un schéma et une table.
J'ai utilisé JMP pour me connecter à la table de la base de données, j'ai concaténé mes données « Chiens contre Loups » et j'ai enregistré les informations dans la base de données. La colonne « image » est enregistrée au format texte dans la base de données à l'aide de la fonction `new image( char to blob("...les informations sur l'image...") )`.
J'ai examiné les données de la base de données, et tout semble conforme aux attentes.
J'ai utilisé Query Builder pour me connecter à ma base de données et interroger l'intégralité de la table Chiens contre Loups.
J'ai converti la colonne Image du type de données Caractère en Expression pour que les images s'affichent correctement dans le tableau. Sur les 2 000 entrées, 1 986 fonctionnent comme prévu. Quatorze images ne s'affichent pas correctement. Ces entrées concernent les images suivantes :
- loups/noms-de-loups-e1528831052890.jpg
- loups/louveteaux.jpg
- loups/loup-4191896__480.png
- loups/pexels-photo-682375.jpeg
- loups/pexels-photo-682361.jpeg
- loups/nature-animal-loup-nature sauvage.jpg
- loups/michael-mazzone-xvLRLLfP22o-unsplash.jpg
- loups/héros_loup_gris_animaux.jpg
- loups/gray-wolf_thumbJPG.jpg
- loups/loup-gris.jpg
- loups/Winter-wolf-snow_-_West_Virginia_-_ForestWander.jpg
- loups/SRX_TRAPAGE_DE_LOUP1.JPG.jpg
- loups/Eurasian_wolfJPG.jpg
- chiens/n02106382_3756.jpg

J'ai examiné les informations relatives aux images et constaté que les lignes présentant des problèmes sont incomplètes. Les entrées s'interrompent au milieu des informations concernant l'image.
J'ai examiné la longueur des informations de l'image et j'ai constaté que les images corrompues ont toutes une longueur de caractères de exactement 524 287. (2^19 - 1).

J'ai tenté de modifier les paramètres JSL générés par Query Builder, mais sans succès. N'étant pas expert en SQL, j'espère que la modification de certains de ces paramètres permettra de résoudre mon problème.
New SQL Query(
Connection(
"
ODBC:AB=0;
BATCHSIZE=100;
BI=0;
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
COMMLOG=2;
CONNSETTINGS=;
D6=-101;
DEBUG=2;
DRIVER={PostgreSQL Unicode(x64)};
EXTRASYSTABLEPREFIXES=;
FAKEOIDINDEX=0;
FETCH=100;
FETCHREFCURSORS=0;
IGNORETIMEOUT=0;
KEEPALIVEINTERVAL=-1;
KEEPALIVETIME=-1;
LFCONVERSION=1;
LOWERCASEIDENTIFIER=0;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
OPTIONALERRORS=0;
PARSE=0;
PQOPT=;
PROTOCOL=7.4;
READONLY=0;
ROWVERSIONING=0;
SHOWOIDCOLUMN=0;
SHOWSYSTEMTABLES=0;
SSLMODE=disable;
TEXTASLONGVARCHAR=0;
TRUEISMINUS1=0;
UNIQUEINDEX=1;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
UPDATABLECURSORS=1;
USEDECLAREFETCH=1;
USESERVERSIDEPREPARE=1;
XAOPT=1;
"
),
QueryName( "dogs_v_wolves" ),
Select(
Distinct,
Column( "Picture", "t1" ),
Column( "Label", "t1" ),
Column( "File Path", "t1" ),
Column( "Short File Name", "t1" ),
Column( "FoldA", "t1" ),
Column( "FoldB", "t1" ),
Column( "FoldC", "t1" ),
Column( "Validation", "t1" )
),
From( Table( "dogs_v_wolves", Schema( "dogs_v_wolves" ), Alias( "t1" ) ) )
) << Run;
J'ai tenté de modifier les paramètres JSL générés par Open Database Table, mais sans succès. Je ne suis pas expert en SQL, et j'espère donc que la modification de ces paramètres permettra de résoudre mon problème.
Open Database(
"
AB=0;
BATCHSIZE=100;
BI=0;
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
COMMLOG=2;
CONNSETTINGS=;
D6=-101;
DEBUG=2;
DRIVER={PostgreSQL Unicode(x64)};
EXTRASYSTABLEPREFIXES=;
FAKEOIDINDEX=0;
FETCH=100;
FETCHREFCURSORS=0;
IGNORETIMEOUT=0;
KEEPALIVEINTERVAL=-1;
KEEPALIVETIME=-1;
LFCONVERSION=1;
LOWERCASEIDENTIFIER=0;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
OPTIONALERRORS=0;
PARSE=0;
PQOPT=;
PROTOCOL=7.4;
READONLY=0;
ROWVERSIONING=0;
SHOWOIDCOLUMN=0;
SHOWSYSTEMTABLES=0;
SSLMODE=disable;
TEXTASLONGVARCHAR=0;
TRUEISMINUS1=0;
UNIQUEINDEX=1;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
UPDATABLECURSORS=1;
USEDECLAREFETCH=1;
USESERVERSIDEPREPARE=1;
XAOPT=1;
",
"SELECT * FROM dogs_v_wolves.dogs_v_wolves"
);
Pour approfondir l'analyse, j'ai créé un script Python qui exécute une requête SQL et enregistre les résultats dans un dataframe pandas. J'ai ensuite créé un fichier JSL qui exécute ce script Python et convertit le dataframe pandas en une table de données JMP.
Le fichier Python s'appelle « sqlQuery.py » et contient :
import pandas as pd
import sqlalchemy as db
engine = db.create_engine("postgresql+psycopg2://##connection information##")
query = """
SELECT DISTINCT *
FROM dogs_v_wolves.dogs_v_wolves;
"""
df = pd.read_sql_query(query, engine)
Le fichier JSL contient :
Names Default To Here( 1 );
pythonFilePath = "sqlQuery.py";
Python Submit File( pythonFilePath );
dt = python get(df);
dt:Picture << set data type(expression);
Lorsque j'exécute ce code, le tableau de données contient l'intégralité des chaînes de texte. Lorsque je convertis la colonne Image en type de données Expression, les images s'affichent correctement.
Conclusions
JMP parvient à écrire avec succès de longues chaînes de texte dans la base de données.
JMP tronque les chaînes de texte longues lors de l'interrogation de la base de données à l'aide de Query Builder et/ou Open Database Table.
L'exécution d'une requête SQL en dehors de JMP renvoie les chaînes de texte complètes stockées dans la base de données.
Désir
J'aimerais pouvoir profiter de la simplicité d'utilisation de Query Builder lors de mes projets de traitement d'images.
Question
Existe-t-il un paramètre dans JMP et/ou JSL que je peux modifier pour activer l'interrogation de valeurs de chaîne plus longues ?
Je n'avais pas essayé le connecteur de données PostgreSQL. J'utilisais uniquement la connexion ODBC intégrée.
Suite à votre recommandation, j'ai essayé le connecteur de données PostgreSQL et je peux confirmer que cette méthode résout le problème de rognage des textes longs.
Je savais qu'il devait y avoir une solution simple, mais je n'arrivais pas à la trouver par moi-même.
Merci pour vos conseils.
Il pourrait y avoir une solution avec ODBC, mais cela nécessiterait peut-être des recherches plus approfondies, car je suppose que cela affecterait les données que vous recevez.
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
et elles ne correspondent clairement pas à votre 524287, il est donc fort probable qu'elle soit écrasée ailleurs (tout en étant toujours trop petite pour votre cas d'utilisation).
@briancorcoran
C’est précisément là que j’ai bloqué. Je me suis un peu trop concentré sur des paramètres comme :
BOOLSASCHAR=0;
BYTEAASLONGVARBINARY=1;
MAXLONGVARCHARSIZE=8092;
MAXVARCHARSIZE=255;
TEXTASLONGVARCHAR=0;
UNKNOWNSASLONGVARCHAR=0;
UNKNOWNSIZES=0;
Malgré l'aide de ChatGPT et de Claude, je n'ai pas trouvé de paramètre permettant de limiter la longueur des chaînes de texte. J'ai pourtant essayé de nombreuses combinaisons de réglages proposées par les IA.
ChatGPT m'a bien aidé à créer le code Python que j'ai utilisé pour ma requête SQL de base présentée dans mon message initial, mais il n'a jamais recommandé l'utilisation du connecteur de données PostgreSQL.
Même si j'aurais pu y arriver avec ma propre requête SQL Python, j'avais l'impression de réinventer la roue et ce ne serait jamais aussi simple que ça devrait l'être.
Vous souhaitez désactiver la récupération des blocs
Preferences(ODBC Disable Block Fetch(1))
utiliser JSL avant de se connecter à la source de données ODBC.
JMP utilise la récupération par blocs pour améliorer les performances lors de l'importation de données provenant de sources ODBC.
La lecture par bloc consiste à remplir un bloc de mémoire contigu de taille N x N à chaque lecture de la source de données, plutôt que ligne par ligne. Avec de grandes quantités de données de type caractère, la lecture peut être tronquée en raison de la taille du bloc. Activer ou désactiver cette option permet à JMP de lire la chaîne ligne par ligne et d'obtenir la chaîne complète.
J'ai essayé cette recommandation et malheureusement, elle ne semble pas fonctionner.
J'ai exécuté le code JSL puis j'ai interrogé ma table en utilisant Fichier -> Se connecter à -> ODBC -> Ouvrir une table de base de données.
Malgré la modification des préférences, les longues chaînes de texte continuent d'être tronquées à une longueur de 524 287 caractères.
