Il metodo migliore per inserire un oggetto Python in JMP<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho del codice Python che può generare circa 3 GB di dati in 15 minuti.Attualmente sta trasmettendo i dati in un file di testo come riga valore1|valore2|valore3.. "colonna" e quindi esegue alcune operazioni di post-elaborazione per convertire l'intero file di testo in un CSV che jmp può aprire.Il file CSV può contenere fino a circa 30.000 colonne e da 100 a 10.000 righe dopo aver suddiviso i valori.
Per far sì che i dati arrivino a JMP più velocemente, vorrei trasmettere in streaming i dati di testo direttamente dalla memoria della sessione Python in una sessione jmp.
Ho provato un po' di automazione ole utilizzando pycom ma sembra che le chiamate a pycom siano molto lente, il che rende difficile l'iterazione su ogni riga e l'aggiornamento della riga corretta per la coppia di valori che vengono prodotti in quella "riga".
C'è un altro modo? tabella di memoria SQLite? Presa JSL?API Python JMP?
Ri: Metodo migliore per inserire un oggetto Python in JMPBrama,
Non è di grande aiuto, ma funziona in questo modo anche in JMP 13. Devo chiedere il supporto di JMP... Forse verrà risolto in JMP 14
Ri: Metodo migliore per inserire un oggetto Python in JMPGrazie per averlo guardato e bella domanda.
Penso che tu stia combattendo il comportamento della riga di comando di Windows con spazi vuoti incorporati nei nomi dei file.In una finestra DOS, utilizzeresti virgolette come queste:

la fuga diventa un po' brutta, ma eccola qui in JSL:
runprogram(executable("cmd.exe"), options({"/C","dir \!"c:\Users\chales\Saved Games\!""}), readfunction("text"))Non ho Python qui in ufficio, ma prevedo che avrà lo stesso comportamento.La situazione peggiora se è necessario incorporare virgolette; un altro progetto su cui sto lavorando ha utilizzato \" come descritto in una delle risposte in http://stackoverflow.com/questions/7760545/cmd-escape-double-quotes-in-parameter
Se puoi scegliere i nomi dei percorsi per i tuoi progetti, tralasciare gli spazi vuoti renderà il tutto più semplice.Se disponi di un selettore di file, devi consentirlo.
Ri: Metodo migliore per inserire un oggetto Python in JMPUn modo molto interessante per utilizzare il programma Esegui
Non ho la soluzione ma funziona in JMP 12.1 su Mac
f = Pick File();
x = RunProgram(
executable("/usr/bin/python"),
options(f),
readfunction("blob")
);
Ri: Metodo migliore per inserire un oggetto Python in JMPCraige@JMP
Stavo riscontrando un problema con Esegui programma che sembrava avere a che fare con le opzioni e il nome file che utilizzo per Esegui programma.Se utilizzo pick file(), si blocca per me.O se codifico una directory con uno spazio al suo interno.
Hai qualche suggerimento per rendere questa dinamica?Utilizzando JMP 12.0.1.
Esempio
f = pick file();
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options(f),
readfunction("blob")
);
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options("/C:/Users/User/Desktop/generate.py"),
readfunction("blob")
);
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options("'C:/Google Drive/Work/Scripting/generate.py'"),
readfunction("blob")
);
//works
x = runprogram(executable("C:\Python34\python.exe"),
options("C:/Users/User/Desktop/generate.py"),
readfunction("blob")
);
Ri: Metodo migliore per inserire un oggetto Python in JMPEcco un esempio completo che viene eseguito in circa 2 secondi per 1.000.000 di doppi:
il codice Python crea un array di double, crea una stringa binaria di byte e scrive i byte su stdout.Puoi utilizzare un file se lo desideri, assicurati solo che sia aperto in modalità binaria (wb).Il ">" all'inizio del formato del pacchetto significa "big endian".
"genera.py"
import arrayimport structimport mathimport sys# windows python messes up binary newlines...unless...if sys.platform == "win32": import os, msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)bigmat = array.array("d")for x in range(0,1000000): bigmat.append(math.sqrt(x))# %s is replaced by "1000000" ... d is for double precision 8 bytes eachbinary = struct.pack(">%sd" % len(bigmat), *bigmat)# print len(binary) # 8000000 bytessys.stdout.write(binary) la JSL utilizza runProgram per eseguire il programma Python e legge un blob dallo stdout.BlobToMatrix specifica "big" per corrispondere ai dati big endian.Potresti usare LoadTextFile( ...BLOB ) invece di runProgram se fai eseguire il programma Python separatamente e scrivi un file.Avresti ancora bisogno di blobToMatrix.
"recupera.jsl"
x = runprogram(executable("C:\Python27\python.exe"), options("C:\Users\User\Desktop\pythonExample\generate.py"), readfunction("blob"));xx = blobToMatrix(x,"float",8,"big");// verify...ok="good";for(i=0,i if( xx[i+1] != sqrt(i), ok="bad"));show(ok); ok = "buono";
http://stackoverflow.com/questions/2374427/python-2-x-write-binary-output-to-stdout aveva la risposta per il problema del newline binario.
Ri: Metodo migliore per inserire un oggetto Python in JMPPenso che potresti spostare dati in virgola mobile IEEE o numeri interi tra Python e JMP utilizzando 7.1. struct — Interpreta i byte come dati binari compressi — Documentazione Python 3.5.0 sul lato Python e blobToMatrix sul lato JMP.Nessuna conversione tra binario e carattere e ritorno al binario lo accelererà molto. Utilizzare un file o un socket tra di loro.Sono sulla stessa macchina? questo renderà tutto un po' più semplice.Non è la stessa macchina? potrebbe non essere in virgola mobile IEEE...I dati dei caratteri richiederebbero una gestione diversa, ma dovrebbero essere più semplici di quelli numerici.