Comprimir y descomprimir json


([N4] rpaton) #1

Hola:

Tengo un JSON que tiene un tamaño de 6 megas. Puedo con velneo o javascrip comprimir esta cadena json con alguna instruccion?

Saludos

Ricardo Patón


([N1] wikan) #2

La única manera es construirlo en una sola línea de texto. Si usas stringify para pasarlo a cadena, ponle “” en el tercer parámetro.


([N4] rpaton) #3

Hola Manuel:
Así lo estoy haciendo y obtengo una cadena que guardo en la variable JSON. Esta cadena es devuelta por una función remota que se encarga de sincronizar ficheros entre aplicaciones. Como el tamaño es grande, cerca de los 6 Megas quisiera comprimir esa cadena.
He mirado por google y he encontrado una función puede comprimir la cadena un 70% pero no sé como integrarla en Velneo.
Adjunto la función por si alguien sabe como hacerlo.

 Saludos.
 Ricardo Patón

jsonpack-master.rar (11.8 KB)


([N1] wikan) #4

Si añades compresión, añades tiempo de ejecución en ambos lados, uno comprime y el otro descomprime. Dependiendo de la conexión a lo mejor ni te compensa.

Si lo que estás sincronizando son datos, quizás tengas otra manera de optimizarlo, no se como lo tienes montado. Pero podrías mandar solo los campos que hayan sido modificados, enviar paquetes más pequeños, etc


([N4] rpaton) #5

Hola:
Son unas 70 tablas con sus registros maestros los que van dentro. Lo hago en json para incluir todos los campos actuales y futuros y olvidarme de la sincronizacion. De ahi que sea ese tamaño. No puedo mirar en tantas tablas campo por campo ya que me llevaria mucho tiempo y podria generar errores.
Quizas como guardo en todas las tablas la fecha de modificacion podria filtar por ella como me comentó en su dia Synetic asi se reducirian los registros y por tanto el tamaño.
Un saludo.
Ricardo Patón


([N1] wikan) #6

Enviar todo es una locura, si ya tienes problemas imagínate cuando siga creciendo.

No se que tipo de sincronización estás montando, cada caso es distinto. En mi caso, mayormente es una centra y distintos puntos.

Yo en mi caso tengo una tabla de tablas, que me indica tabla y registro, cada vez que se modifica lo guardo en la tabla si no existe.
Cada cierto tiempo proceso esa tabla y envió solo lo que se ha modificado.

En el caso de documentos, genero un fichero por cada venta y así los proceso de manera individual.

He tenido que hacer y deshacer unas cuantas veces sobre todo para la v6 ya que hay que tener mucho cuidado con los bloqueos, así que poco a poco irás mejorando.

** A la vez que recorres los campos de una tabla para generar el json, puedes revisar con isFieldModified y generar solo con los campos modificados.


([N4] Infortic) #7

Mandarlo todo a la larga como dice wikan tendrá sus problemas, ya que la cantidad de registros va creciendo…

No sólo ésto, al importar los datos, que supongo lo harás transaccionalmente, tendrás problemas, vServer cuando llega a transacciones de un determinado tamaño (de más o menos un millón de escrituras), se cae la transacción y te la deshace.

Tendrás que trocear los paquetes con una cantidad de registros máxima para evitar éste problema.

En cuanto a qué registros enviar hay varias formas, la mejor es la que comentas de usar la fecha de modificación para enviar sólo los que han cambiado desde el último envío. Otra forma es poner un booleano en la tabla y ponerlo a 1 cuando cambia el registro y pones un índice que te saque sólo los modificados. Conforme lo exportas para enviar lo pones 0.

En cualquiera de los dos casos, si la comunicación es bidireccional hay que tener cuidado al importar, para que estos campos de control (la fecha de modificación o el booleano) no se queden marcados al importar el registro, pues si no, se quedará “rebotando” entre los servidores.


([N4] rpaton) #8

Hola:
Los maestros no van a cambiar mucho. La mayor carga es al instalar la primera version ya que cada tienda debe recibir sus datos maestros especificos.
Si activo el filtrado por fechas las siguientes sincronizaciones seran mas cortas.
Los pedidos no me preocupan ya que se envian individuales al momento de aceptar.
Revisare. Lo de si el campo ha sido modificado por si me sirve para algo tambien.
Gracias

Un saludo
Ricardo Patón


([N1] wikan) #9

Buenas, si evita todo el tráfico innecesario, solo lo modificado.

Yo te añado un problema más, si tienes varias tiendas y alguna se queda sin conexión. No puedes marcar como enviado algún dato. Ya que alguien no ha recibo los cambios. Tienes que independizar las colas por tiendas.


([N4] rpaton) #10

Hola:
Como guardare en cada tienda la fecha y hora de sincronizacion OK tendre que comparar siempre si la fecha tienda es menor que central, entonces el registro se sincroniza.
Saludos
Ricardo Patón