2010-12-04 8 views
6

Nuestra aplicación debe mostrar una gran cantidad de datos con un mínimo de solicitudes HTTP remotas, por lo que hemos agregado un punto final a nuestro back-end que proporciona todos los datos necesarios como una única respuesta json. Esto resulta en ~ 1.5MB (comprimido) o aproximadamente 8 MB de texto json sin formato.¿Cuál es la forma más eficiente de convertir una respuesta JSON de 10 MB en un NSDictionary?

No hay mucho problema, se descarga en 10-30 segundos y estamos utilizando ASIHTTPRequest para escribir toda la respuesta al disco.

Ahora viene la parte divertida: después de leer el archivo descomprimido en una cadena mapeada en la memoria, usamos el json-framework de stig para convertirlo en un NSDictionary. Esto ha funcionado muy bien para el resto de nuestra aplicación y la típica respuesta JSON de 2 KB para el resto de nuestros puntos finales API. Sin embargo, la deserialización de estos 8 MB de datos lleva de un par de segundos (simulador) a minutos (3G y iPod touch de 2da generación).

Estoy investigando el mejor enfoque para leer en todos estos datos.

Me encantaría utilizar listas binarias servidas directamente desde el servidor, pero estamos usando Java y no he encontrado una biblioteca adecuada que cumpla con nuestros requisitos, y con un plazo tan ajustado, escribir la nuestra podría no ser la mejor idea

Si ayuda de ninguna manera, la cadena JSON que está analizando es sobre todo una serie de X artículos, así:

{ 
    "items": [ { "key1": "value1", "key2": "value2" }, 
       { "key1": "value1", "key2": "value2" }, 
       { "key1": "value1", "key2": "value2" }, 
       { "key1": "value1", "key2": "value2" }, 
       { "key1": "value1", "key2": "value2" }, 
       { "key1": "value1", "key2": "value2" } 
      ] 
} 

¿Cuál es el método más eficiente para leer en este 8 MB formato JSON cadena en un NSDictionary en la memoria?

+0

¿Puede dividirlo en archivos más pequeños y leer cada uno en la demanda? ¿O * necesitas * todos los 8 MB a la vez? – JoePasq

+0

Tengo que ir con: egads. ¿Cómo se pueden visualizar 8MB de texto en una pantalla tan pequeña? Me iré, es probable que haya otro enfoque que sea más eficiente. – joshpaul

+0

No se muestra todo a la vez. Es una guía de programación de TV interactiva, dividida en bloques de una hora con 900 canales cada uno. Entonces son ~ 7 * 24 vistas de tabla secuenciales, cada una con> 900 programas. El usuario puede necesitar solo las primeras 4 horas más o menos en este momento, pero el requisito es que debe poder recuperar cualquiera de los otros días/horas sin pausa. Inicialmente, solo descargaba 4 horas de datos a la vez, pero el código que mantenía un registro de los que estaban disponibles en Core Data y que era necesario descargar aún, era demasiado complejo de mantener, por lo que optamos por descargar todos los datos en un pase. –

Respuesta

7

Eche un vistazo a JSONKit. Es muy rápido, y si su JSON tiene muchas claves y valores que se repiten (como es habitual), su "caché de objetos instanciados recientemente" reducirá drásticamente la cantidad de memoria utilizada para el "final" NSDictionary.

+1

Muy bueno. No había visto esto antes. Me encantaría saber qué tan rápido es esto con los 8MB de datos. –

+0

+1 ¡Había olvidado este proyecto! Gracias por el recordatorio. :) –

+1

Corrió algunos puntos de referencia con JSONKit y obtuvo una mejora del 200%. Gran sugerencia –

2

Mientras JSONKit es más rápido que YAJL, YAJL admite el análisis sintáctico de la transmisión. Debería poder conectarlo con ASIHTTPRequest para analizar JSON mientras lo está descargando. Echa un vistazo a la sección denominada "análisis de estilo de documento como datos de que se disponga" aquí:

http://gabriel.github.com/yajl-objc/

Cuestiones relacionadas