El mejor método para introducir un objeto Python en JMP<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo un código Python que puede generar aproximadamente 3 GB de datos en 15 minutos.Actualmente está transmitiendo los datos a un archivo de texto como una línea de "columna" valor1|valor2|valor3.. y luego realiza un procesamiento posterior para convertir todo el archivo de texto en un csv que jmp pueda abrir.El archivo csv puede tener hasta ~30.000 columnas y de 100 a 10.000 filas después de dividir los valores.
Para que los datos lleguen a JMP más rápido, me gustaría transmitir los datos de texto directamente desde la memoria de la sesión de Python a una sesión de jmp.
Probé algo de automatización antigua usando pycom, pero parece que las llamadas a pycom son muy lentas, lo que dificulta la iteración en cada línea y la actualización de la fila correcta para el par de valores que se producen en esa "línea".
¿Hay otra manera? tabla de memoria sqlite? ¿Toma JSL?¿API de Python JMP?
Re: El mejor método para introducir un objeto Python en JMPCraig,
No es de mucha ayuda, pero también funciona de esta manera en JMP 13. Tengo que preguntarle al soporte técnico de JMP... Tal vez se solucione en JMP 14.
Re: El mejor método para introducir un objeto Python en JMPGracias por mirarlo y buena pregunta.
Creo que estás luchando contra el comportamiento de la línea de comandos de Windows con espacios en blanco incrustados en los nombres de los archivos.En un cuadro de DOS, usarías comillas como esta:

el escape se pone un poco feo, pero aquí está en JSL:
runprogram(executable("cmd.exe"), options({"/C","dir \!"c:\Users\chales\Saved Games\!""}), readfunction("text"))No tengo Python aquí en la oficina, pero anticipo que tendrá el mismo comportamiento.La cosa empeora si necesita incluir comillas; otro proyecto en el que estoy trabajando usó \" como se describe en una de las respuestas en http://stackoverflow.com/questions/7760545/cmd-escape-double-quotes-in-parameter
Si puede elegir los nombres de las rutas para sus proyectos, omitir los espacios en blanco lo hará más fácil.Si tiene un selector de archivos, debe permitirlo.
Re: El mejor método para introducir un objeto Python en JMPUna forma muy interesante de utilizar Ejecutar programa
No tengo la solución pero esto funciona en JMP 12.1 en Mac
f = Pick File();
x = RunProgram(
executable("/usr/bin/python"),
options(f),
readfunction("blob")
);
Re: El mejor método para introducir un objeto Python en JMPCraige@JMP
Estaba teniendo un problema con Ejecutar programa que parecía tener que ver con las opciones y el nombre de archivo que uso para Ejecutar programa.Si uso pick file(), se bloquea.O si codifico un directorio con un espacio.
¿Tienes alguna sugerencia para hacer esta dinámica?Utilizando JMP 12.0.1.
Ejemplo
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")
);
Re: El mejor método para introducir un objeto Python en JMPAquí hay un ejemplo completo que se ejecuta en aproximadamente 2 segundos para 1.000.000 de dobles:
el código Python crea una matriz de dobles, crea una cadena binaria de bytes y escribe los bytes en la salida estándar.Puede usar un archivo si lo desea, solo asegúrese de que esté abierto en modo binario (wb).El ">" al principio del formato del paquete significa "big endian".
"generar.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) JSL usa runProgram para ejecutar el programa Python y lee un blob desde la salida estándar.BlobToMatrix especifica "grande" para que coincida con los datos big endian.Puede usar LoadTextFile( ...BLOB ) en lugar de runProgram si hace que el programa Python se ejecute por separado y escriba un archivo.Aún necesitarías blobToMatrix.
"fetch.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); vale = "bien";
http://stackoverflow.com/questions/2374427/python-2-x-write-binary-output-to-stdout Tenía la respuesta para el problema de la nueva línea binaria.
Re: El mejor método para introducir un objeto Python en JMPCreo que podrías mover datos de punto flotante IEEE o números enteros entre Python y JMP usando 7.1. struct — Interpretar bytes como datos binarios empaquetados — Documentación de Python 3.5.0 en el extremo de Python y blobToMatrix en el extremo de JMP.Ninguna conversión entre binario y carácter y volver a binario lo acelerará mucho. Utilice una lima o un enchufe entre ellos.¿Están en la misma máquina? eso lo hará un poco más fácil.¿No es la misma máquina? Puede que no sea punto flotante IEEE...Los datos de caracteres necesitarían un manejo diferente, pero deberían ser más fáciles que los numéricos.