el 06-16-2015 11:48 AM
Buenas,
Estoy teniendo problemas a la hora de enviar datos mediante Network Stream.
Cuando lleva tiempo ejecutándose, pierde datos de envío. El caso que cuando miro desde el PC en mi programa si veo que lo esté enviando (dentro del subvi de networkstream), pero no recibe todos los datos en el receptor.
He implementado estas dos opciones (Envio_data1.png & Envio_data2.png),
Lo que ejecuta es, cada vez que llegan datos en "results 2" los divide en 3 sub clusters de menor tamano (2000) y los envia sucesivamente a través de networkstream.
Me podeis por favor indicar alguna forma de optimizar este código, y a qué puede ser debido este problema?
Un saludo y muchísimas gracias!!!!
el 06-19-2015 09:13 AM
Hola Juanfer23,
Tu aplicacion se ve bastante interesante sin embargo creo que falta informacion para realmente poder serte de ayuda. De lo que puedo ver de tus imagenes estas utilizando variables globales que se escriben a si mismas. Hacer este tipo de operaciones puede ocasionar incertidumbre en los valores de la variable (DATA por ejemplo). Tienes el codigo de la parte receptora? Puedes describir mejor la perdida de datos que estas experimentando?
saludos
el 06-21-2015 06:12 AM
Hola EFranz,
Muchas gracias por tu ayuda, te adjunto el código de la parte receptora, que se encuentra en el Host (PC).
El sistema parece funcionar correctamente por una media hora y entonces a pesar de que en el RT parece realizar las operaciones correctamente, en mi PC no recibo los datos enviados. Recibe sólo cada cierto tiempo.
Agradecería cualquer sugerencia para mejorar el código.
Un saludo y gracias!!!!
el 06-22-2015 08:36 AM
Yo realmente no se mucho de ese tema pero voy a hacer un pequeño comentario. Cuando lleve el curso de labview vimos
un tema que se llamaban queue o algo asi en el productor consumidor y la ventaja que daba es que no se perdian datos
como ejemplo ponian un transmisor o un generador de valores a una cierta velocidad y un receptor o un lector de valores
pero a diferentes velocidades y lo que pasava era que con el metodo tradicional al ser mas rapido el que lee valores repetidos
por decir algo el que genera el valor genera un 50 despues un 40 y un 30 y el que los lee puede leer 50 50 40 30 30 ya que lee
mas rapido ahora si el que lee fuera mas lento podria leer 50 30 ya que al leer mas lento puede perder datos y con los queue
la ventaja era que no se perdian datos ya que siempre esta esperando por un dato nuevo si es mas rapido y si es mas lento al
terminar de mandar datos el que los lee sigue leyendo o trabajando hasta terminar con todos los datos que leeria 50 40 30
espero esto te sirva de ayuda mira algun ejemplo con este tema y haber si se puede resolver tu problema y adaptarlo a tu programa
saludos.
el 06-22-2015 02:22 PM
Hola juanfer23,
Despues de ver tu codigo me parece que tu problema es un memory leak. Cuando estas usando network streams con un tipo de dato escalar (booleanos, numericos, etc..) el bufer determina la cantidad de memoria que la computadora va a estar reservando para tus operaciones. En el caso de usar tipos de datos como clusters o strings la memoria se va utilizando y alocando dinamicamente. Esto quiere decir que los paquetes que vas recibiendo van incrementando el uso de la memoria de tu sistema.
Para evitar esto hay muchas soluciones. Por lo que veo tu arquitectura y los tipos de datos seleccionados ya estan determinados ( trabajar con escalares ayudaria muchisimo y seria mas facil de debuggear) por lo que te recomiendo que trates de reducir el buffer size del reader o establezcas la propiedad para leer todas las muestras disponibles en el stream (ver imagen).
Por otro lado tu variable global RECEIVE es un arreglo que no deja de crecer. Esto esta impactando muchisimo a la memoria de tu sistema. Te sugiero que mejor escribas a disco (a un archivo tipo TDMS por ejemplo) y que vayas sobreescribiendo los valores de esta variable y tus otras variables globales que veo que usas para controlar la logica de tu programa.
Espero que con estos consejos logres mejorar el rendimiento de tu programa.
Te deseo exito!
el 06-23-2015 04:25 AM
Hola Juanfer,
también puedes hacer un sniffer de red con el WireShark para monitorizar el tráfico y que nos dé alguna pista adicional:
saludos!
Jesús