Pregunta

Tengo una aplicación web en la que un editor de lado del cliente es la edición de un texto muy, muy grande que se conoce en el lado del servidor.

El cliente puede realizar cualquier tipo de modificaciones a este texto.

¿Cuál es la eficiente en la red forma más para transmitir la diferencia resultado de una manera que el servidor entiende? También, ya que esto va a suceder en el lado del cliente (Javascript), también me gustaría que sea 'rápida' (o al menos no notablemente lento)

Algunos escenarios:

  • usuario modifica un carácter
  • usuario modifica varias frases en posiciones aleatorias
  • borra todo usuario y da como resultado un texto en blanco.

I no puede usar diff-como sintaxis ya que no es eficiente a la red, comprueba líneas, donde los ejemplos 1 y 3 producirán diferencias horribles (especialmente el último, donde el resultado será más que el antiguo sí mismo).

Cualquier persona tiene experiencia en esta materia? Usuario opera en un muy gran conjunto de datos -. 3-5MB alrededor del texto, y la carga de todo el "nuevo" el contenido es un gran no-no

Para que quede claro, yo estoy buscando un "protocolo" de la transferencia, la comparación de cadenas no es el problema.

¿Fue útil?

Solución

No estoy muy familiarizado con este tema pero que puede apuntar a un código abierto (Apache License 2.0) proyecto que puede ser muy útil.

Es una biblioteca de diferencias, de ajuste y de parches escrito en varios idiomas, incluyendo JavaScript, de un ingeniero de Google y se utiliza en varios servicios de edición de colaboración en línea.

Aquí hay una lista de recursos:

Otros consejos

Un enfoque simple, suponiendo que se conoce la copia en el servidor no va a cambiar, no sería más que enviar una lista de ediciones (deleciones y adiciones), con las eliminaciones representan como un índice de inicio y fin, y las adiciones representados como un índice de inicio y el texto a insertar.

Si usted tiene más de un simple algoritmo de diferencias para trabajar (no estoy seguro exactamente lo que quiere decir con "la comparación de cadenas no es la cuestión"), también se pudo detectar movido o trozos de texto copiado, y enviar los como el índice de inicio y final de la pieza a mover o copiar del texto, así como el destino para insertarlo.

Tenga en cuenta que tendrá que asegurarse de mantener un seguimiento de si los índices se refieren al documento original, o el documento como editado hasta el momento. Un enfoque fácil de evitar este problema es realizar siempre las ediciones desde el final del documento hacia el principio; a continuación, las ediciones anteriores no afectarán a los desplazamientos especificados por las ediciones posteriores.

Para un ejemplo de un enfoque de este tipo, ver el formato que ed diff -e salidas. Esto es básicamente de entrada que podría ser alimentado a la href="http://www.gnu.org/software/ed/manual/ed_manual.html" rel="nofollow noreferrer"> ed editor de texto . Si desea que las diferenciaciones absolutos más pequeños para enviar al otro lado es posible que desee hacer la indexación basada en caracteres en lugar de indexación basada en la línea, pero el mismo enfoque básico podría funcionar.

Cualquier edición de la realización puede ser roto de manera eficiente hacia abajo en el usuario: Eliminar de X para la longitud Y; insertar al texto X "lo que sea". X e Y son compensaciones en caracteres desde el comienzo del texto; Y es un número de caracteres; "Lo que" es cualquier cadena de caracteres. Usted dice que usted no necesita ninguna ayuda calculando el diff, pero un ejemplo es aquí , excepto que es más rica en su salida de lo que necesita, pero sí identifica 'el traslado e inserciones', por lo que, simplemente cambiar la parte de salida.

El formato exacto en el que se envían los datos al servidor puede ser sintonizado, pero no creo que haya mucho kilometraje en hacer que - a la espera de la medición, me gustaría empezar enviando los comandos como D para borrar o yo para la inserción, los números en decimal, la cadena insertada en forma citado. Una vez que tenga que se realizan algunas estadísticas sobre las transferencias reales, se puede ver la cantidad de sobrecarga está en los números (decimal vs binario) y cotizaciones, pero sospecho que puede no ser tan significativa (si se demuestra que es, hay todo tipo de las cosas que usted puede intentar, como dar compensaciones a partir del último punto de inserción o deleción, en lugar de siempre desde el principio, para hacer las cosas más rápido).

Se puede probar lo que el usuario está haciendo cada pocos segundos, y acaba de enviar los cambios incrementales en los últimos segundos (si lo hay) - de esta manera, cada paquete va a enviar será pequeño, y si la conexión a la red o desplome de la computadora / navegador del usuario, el usuario no pierde mucho trabajo.

Sólo puede enviar cambios cada 500 ms, por lo que, cualquier cambio que se hicieron en el que se enviaría en los últimos 500 ms, pero sólo enviar datos cuando hubo un cambio.

En este Puede pasar después la posición de la palabra cambiada (s) y acaba de enviar la palabra completa, pero tendría que ser la posición de la parte delantera del texto.

No habrá varias frases pena, pero puede haber varias palabras involucradas, pero, si se le envía con el fin de cambio, entonces el resultado debe ser coherente.

Debido a que hay muchas maneras de hacer ediciones - incluso durante periodos breves de tiempo como 500 ms - incluyendo arrastrar y soltar o cortar y pegar, grandes secciones de texto alrededor dentro del documento o de fuera de ella - no sé si va a ser algo que va a cubrir todos los escenarios muy bien. Este es sin duda un no-respuesta a su pregunta a su valor nominal, pero yo consideraría cuidadosamente el problema de desarrollar y mantener algo como esto en comparación con el cambio de la interfaz para restringir el tamaño del texto y romper los textos existentes en piezas más pequeñas.

Tal vez eso no es posible en su situación, pero si lo es, yo supongo que sería mucho menos problemas en el final de esquivar el problema de esta manera y acaba de enviar los documentos completos después de una edición.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top