Какой самый эффективный способ преобразования ответа JSON размером 10 МБ в NSDictionary? - PullRequest
6 голосов
/ 04 декабря 2010

Наше приложение должно отображать большой кусок данных с минимальными удаленными http-запросами, поэтому мы добавили конечную точку в наш бэкэнд, которая предоставляет все необходимые данные в виде одного ответа json. В результате получается ~ 1,5 МБ (сжатый) или примерно 8 МБ несжатого текста в формате json.

Немного проблем, он загружается через 10 - 30 секунд, и мы используем ASIHTTPRequest для записи всего ответа на диск.

Теперь самое интересное - после считывания несжатого файла в отображенную в память строку мы используем стиг json-framework , чтобы преобразовать его в NSDictionary. Это сработало очень хорошо для остальной части нашего приложения и типичного ответа json размером 2 КБ для остальных наших конечных точек API. Однако десериализация этих 8 МБ данных занимает от пары секунд (симулятор) до минут (3G и iPod Touch 2-го поколения).

Я изучаю наилучший подход для чтения всех этих данных.

Я бы с удовольствием использовал бинарные списки, обслуживаемые прямо из бэкэнда, но мы используем Java, и я не нашел подходящей библиотеки, которая бы соответствовала нашим требованиям, и при таких сжатых сроках написания собственных, возможно, не лучший идея.

Если это поможет каким-либо образом, строка json, которую мы анализируем, в основном представляет собой массив элементов X, например:

{
    "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" }
             ]
}

Какой самый эффективный метод для чтения этой строки в формате MB json размером 8 МБ в NSDictionary в памяти?

Ответы [ 2 ]

7 голосов
/ 04 декабря 2010

Взгляните на JSONKit . Это очень быстро, и если ваш JSON имеет много ключей и значений, которые повторяются (как обычно), его «недавно созданный экземпляр объектного кэша» значительно сократит объем памяти, используемой для «финала» NSDictionary.

2 голосов
/ 20 декабря 2010

Хотя JSONKit работает быстрее, чем YAJL, YAJL поддерживает разбор потока. Вы должны иметь возможность подключить его к ASIHTTPRequest для анализа JSON , пока загружает его. Ознакомьтесь с разделом «Анализ стиля документа по мере поступления данных» здесь:

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

...