2010-04-26 15 views
5

Tengo un simple dato que estoy almacenando en un servidor, como una cadena simple. Es un poco ridículo, pero se ve así:¿Cómo crear y analizar cadenas enormes con javascript?

name|date|grade|description|name|date|grade|description|repeat for a long time 

esta cadena puede ser de hasta 1,4 MB de tamaño. La idea es que se trata de un conjunto de registros de estudiantes, simplemente unidos con un simple delímetro de tubería. Es un método de serialización muy pobre.

Una vez que esta cadena masiva se envía al cliente, se divide a lo largo de las tuberías en los registros de los estudiantes, utilizando javascript.

He estado cronometrando cuánto tiempo lleva crear y dividir estas cadenas en el lado del cliente. Los tiempos en realidad son bastante buenos, la ejecución más lenta que he visto en algunas máquinas diferentes es de 0.2 segundos para 10,000 'registros estudiantiles', que tiene un tamaño de cuerda final de ~ 1.4mb.

Me doy cuenta de que esto es bastante extraño, solo me pregunto si hay algún problema inherente a la hora de crear y dividir cadenas tan grandes usando javascript. No sé cómo diferentes navegadores implementan sus motores de JavaScript. Intenté esto con los navegadores "principales", pero no sé cómo funcionaría esto en versiones anteriores de cada uno.

Sí, buscando cualquier comentario sobre esto, esto es más por diversión que otra cosa!

Gracias

Respuesta

1

cadena división de datos de 1,4 MB no es un problema para las máquinas decente, en lugar usted debe preocuparse por la velocidad de conexión a Internet de sus usuarios. Intenté hacer una revisión ortográfica con un diccionario de 800 kb (que es la mitad de tus datos), el problema principal fue el tiempo de carga.

Pero parece que los datos de los registros de sus alumnos pueden colocarse en la base de datos y no necesitan cargar todo en el momento de carga. Entonces, ¿qué tal una paginación para mostrar los registros de usuario o utilizar ajax para buscar ciertos nombres de usuario?

+0

+1 el único problema que veo es la dependencia en una implementación basada en navegador JS. – lexu

1

Si se trata de una gran cadena de realmente puede pagar para cortar continuamente la cadena con 'string'.slice(from, to) a procesar sólo un subconjunto pequeño, añadiendo todos los elementos individuales hasta el final de la salida con list.push() o algo similar podría funcionar.

Los métodos de división de cadenas son probablemente la forma más eficiente de hacerlo, incluso en IE. El procesamiento de caracteres individuales con string.charAt(x) es extremadamente lento y, a menudo, mostrará un error de seguridad al detener el navegador. El uso de métodos de división de cadenas sería mucho más rápido que la división con expresiones regulares.

También es posible codificar los datos usando una matriz JSON, algunos navegadores más nuevos como IE8/Webkit/FF3.5 tienen un rápido análisis JSON incorporado usando JSON.parse(data). Pero usar eval(JSON) puede desbordar el navegador si hay suficientes datos, por lo que probablemente sea una mala idea. Sin embargo, pagar por comparar el rendimiento.

Un enfoque mucho mejor en muchos casos es usar AJAX y solo cargar algunos de los datos a la vez desde el servidor, lo que también ahorraría tiempo de descarga.

1

Además de excelentes comentarios de S. Mark sobre local frente a velocidad de x-fer y la punta para volver a codificar usando AJAX, sugiero un (a largo plazo) alejarse de JavaScript en el navegador (el supuesto de que de se que se ejecuta) a una implementación de JS sin navegador (o posiblemente a otro idioma).

Un navegador basado en JS parece un enlace de semana en una cadena data-x-fer y nada que desee ejecutar sin control, ya que los navegadores se actualizan de vez en cuando y romper su JS-x-fer podría ser imprevisto ¡efecto secundario!

Cuestiones relacionadas