Java - Pasar datos de Python a java

 
Vista:
sin imagen de perfil
Val: 203
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Pasar datos de Python a java

Publicado por Jose Andres (27 intervenciones) el 16/05/2019 08:47:22
Saludos, Estoy trabajando en una aplicacion en python pero utilizando una interfaz grafica en java, el problema es que para pasar los datos de Python a java y viceversa estoy utilizando las funciones de ProcessBuilder de java, los datos son exactamente vectores y matrices, cuando son pequeñas no hay problema pero suelen salir de 200 a 400 valores, quisiera saber si existe alguna manera de pasar los datos mas eficientemente
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Pasar datos de Python a java

Publicado por Tom (1831 intervenciones) el 16/05/2019 09:04:15
¿ Cómo usas ProcessBuilder para pasar datos ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 203
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Pasar datos de Python a java

Publicado por Jose Andres (27 intervenciones) el 16/05/2019 18:39:24
insurrecciono la salida del programa a un bufferedreder y un bufferedwriter, y capturo las salidas de un printde python, basicamente en java obtengo el print de python
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar datos de Python a java

Publicado por Tom (1831 intervenciones) el 16/05/2019 19:41:13
Es de suponer (me ha costado un poco) que quieres decir "redirecciono".
Parece que estás usando usando un fichero en disco (podías dar más datos si esperas una solución apropiada) y no es la mejor forma.
En principio, al menos en unix o linux, puedes usar pipes (lo mismo que en la shell) que son bastante rápidos.
O también puedes usar sockets para intercambiar mensajes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Omar
Val: 77
Ha disminuido su posición en 8 puestos en Java (en relación al último mes)
Gráfica de Java

Pasar datos de Python a java

Publicado por Omar (24 intervenciones) el 16/05/2019 22:57:20
Disculpen mi ignorancia pero no es mejor usar servicios? Digo el hecho de usar socket es mucho consumo de memoria. :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 203
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Pasar datos de Python a java

Publicado por Jose Andres (27 intervenciones) el 16/05/2019 23:35:29
Es una excelente idea, no se me había ocurrido, lo voy a probar, en cuanto a usar PIPES, es exactamente lo que estoy usando, esta arrojando un array de 100 elementos y matrices de 40x2 aproximadamente y en un lapso de 3 cada 2 segundos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar datos de Python a java

Publicado por Tom (1831 intervenciones) el 17/05/2019 00:24:37
1.000.000 de ints en 330 milisegundos (unos 3.000.000 de enteros por segundo) con un simple pipe.
Enviando en c (kk.c):

1
2
3
4
5
6
7
8
9
10
11
#include <unistd.h>
#include <byteswap.h>
 
/* */
int main(int argc, char *argv[]) {
	int out;
	for(int i = 0; i < 1000000; i++) {
		out = bswap_32(i);
		write(1, &out, sizeof(out));
	}
}

Leyendo en Java (ReadInt.java):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.DataInputStream;
import java.io.IOException;
 
/* */
public class ReadInt {
	/* */
	public static void main(String args[]) {
		int v = -1, count = 0;
		DataInputStream in = new DataInputStream(System.in);
		long timestamp = System.currentTimeMillis();
		try {
			while(true) {
				v = in.readInt();
				//System.out.printf("%d\n", v);
				count++;
			}
		} catch(IOException ex) {
			// Finished
		}
		System.out.printf("Read %d integers took %d ms\n", count, System.currentTimeMillis() - timestamp);
	}
}

Ejecutando:

1
2
3
~/$ kk | java ReadInt
Read 1000000 integers took 332 ms
~/$
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 203
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Pasar datos de Python a java

Publicado por Jose Andres (27 intervenciones) el 17/05/2019 06:57:35
El programa en java inicia primero y este a su ves inicia el programa en python

1
2
3
4
5
6
ProcessBuilder PB = new ProcessBuilder("S.bat");
PB.redirectInput(ProcessBuilder.Redirect.PIPE);
PB.redirectOutput(ProcessBuilder.Redirect.PIPE);
PB.redirectError(ProcessBuilder.Redirect.PIPE);
P = PB.start();
BufferedReader BR = new BufferedReader(new InputStreamReader(P.getInputStream()));

Con ProcessBuilder ejecuto el programa y redirecciono las salidas y entradas.
Con BR obtengo todos los "print" del programa en python

1
2
3
BR.lines().forEach((Entrada) -> {
                //CODIGO
});

Buscando por internet no encontre algo similar a como lo hiciste sin usar el processbuilder, me sorprendio la rapidez con la que mando el millon de numeros, de esta manera toma 10 veces mas, 3500 milisegundos esa misma cantidad de numeros.

1
2
3
4
5
6
int c=0;
while ((S = BR.readLine()) != null) {
    c++;
}
System.out.println("Tiempo: "+(System.currentTimeMillis() - t)+", Numeros: "+c);
//Salida Tiempo: 3721, Numeros: 1000006

Por ejemplo el programa en python regresa algo como esto:
MAX [[3, 25], [13, 13], [13, 14], [12, 14], [12, 15], [11, 15], [11, 16], [10, 16], [10, 17], [9, 17], [9, 18], [8, 18], [8, 19], [7, 19], [7, 20], [7, 21], [6, 21], [6, 22], [5, 22], [5, 23], [4, 23], [4, 24], [3, 24]]
Son como 40 numeros pero en bytes son como 200, que son basicamente paquetes de numeros

Pasar los datos de esta manera fue la primera forma que se me ocurrio y no se si es lo mejor, a mi punto de vista parece muy precario y precisamente por eso quisiera saber si existe algo mejor de momento funciona perfectamente todo esta dentro de los tiempos y me ha creado cuellos de botella, pero progrsivamente comenzara a retornar las "sets" de datos al mismo tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar datos de Python a java

Publicado por Tom (1831 intervenciones) el 17/05/2019 09:14:09
En unix, y linux, el texto legible es el método preferido y más simple de intercambio de información entre procesos. Hay gente que lo acepta y lo ve bien, y gente que no lo ve tan bien. Lo que si está claro es que es mucho más fácil localizar errores cuando tú mismo puedes leer el contenido de los mensajes.
Tu método puede llegar a ser algo lento por usar Bufferedreader y BR.lines().
Mucho mejor lo segundo que pusiste, con BR.readline(). Y redirecciona solo los streams del proceso que realmente vayas a usar.
Por otra parte lo que sí puedes hacer es simplificar el formato de cada línea quitando caracteres innecesarios ('[', ',')
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 203
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Pasar datos de Python a java

Publicado por Jose Andres (27 intervenciones) el 17/05/2019 18:59:39
Perfecto, y gracias por la ayuda.
Haciendo pruebas, ambas formas me dan tiempos muy similares, el unico problema que podria haber seria el contexto de las variables, en el primero no puedo usar variables locales pero por la forma en que uso el programa eso no me afecta, lo que si no se, es si uno usa mas memoria que el otro, realmente uso el BR.lines por su simpleza eso fue todo.

1
2
3
4
5
6
7
BR.lines().forEach((Entrada) -> {
                //CODIGO
});
 
while ((S = BR.readLine()) != null) {
    //CODIGO
}

En cuanto al formato de salida si tienes mucha razon en quitar los caracteres innecesarios, aunque solo podria quitar los espacios, de lo contrario no sabria si es array o matriz y la forma de limitarlos, aunque solo utilizo matrices de 2 dimenciones y siempre son similares al ejemplo, podria especificar de antemano si es array o matriz y solo dejar las comas.

Bueno, seguire usando esto de momento no me da problemas y probablemente nunca me los de, permitiendome un flujo de 250000 bytes por segundo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar datos de Python a java

Publicado por Tom (1831 intervenciones) el 16/05/2019 23:36:07
¿ Un socket consume mucha memoria ? ¿ A qué servicios te refieres ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar