Большой JSON и почему он всё подвешивает
Файл на 300 МБ открывается пять минут и съедает несколько гигабайт памяти. Это не лень разработчиков редактора — это свойство формата, и обойти его можно только сменой формата.
Почему JSON нельзя читать по частям
JSON — единое выражение. Формально, чтобы убедиться, что документ корректен, нужно дойти до последней скобки. Нельзя взять середину файла и разобрать её отдельно: непонятно, на каком уровне вложенности вы находитесь и не оборван ли текст посреди строки.
Отсюда следствие: разбор идёт целиком, и в памяти оказывается весь документ. Причём не в виде текста, а в виде объектов — а они занимают в разы больше.
Практическое правило: разобранный JSON занимает в 5–10 раз больше исходного файла. Файл на 300 МБ — это два-три гигабайта памяти, и вкладка браузера на этом заканчивается.
Что можно сделать
- Попросить JSON Lines. Если файл формирует ваша система или API, это самое дешёвое решение: формат читается построчно, память не растёт.
- Выгружать страницами. Большинство API умеют отдавать данные порциями — так файл вообще не станет большим.
- Преобразовать потоковым разборщиком.
jqи специализированные библиотеки умеют читать JSON потоком и выдавать построчный результат, не держа документ целиком. - Загрузить в базу. Если такие объёмы приходят регулярно, просмотрщик — не то решение, которое нужно.
Наши границы, названные честно
Разбор идёт в браузере, поэтому ограничения жёстче, чем у настольной программы. Свыше 128 МБ мы предупреждаем о расходе памяти и времени. Свыше 512 МБ — отказываемся открывать и говорим почему, вместо того чтобы подвесить вкладку и потерять то, что было открыто рядом.
Для JSON Lines таких ограничений нет: строки читаются по одной, и предел — пять миллионов записей.
Как понять, что файл слишком большой, заранее
Ориентир простой: возьмите размер файла и умножьте на восемь. Если получившееся число больше свободной оперативной памяти — открывать не стоит ничем, кроме потокового инструмента.
Отдельно стоит посмотреть на структуру: файл в 200 МБ из миллиона мелких записей и файл в 200 МБ из тысячи огромных объектов ведут себя по-разному. Второй случай обычно тяжелее, потому что в нём глубокая вложенность.
Частые вопросы
Почему VS Code открывает, а браузер нет?
Редактор показывает текст и подсвечивает синтаксис, не строя объектную модель. Как только вы включите форматирование или свёртку — он тоже задумается.
Поможет ли 64-разрядная программа?
Снимет предел адресного пространства, но не потребность в памяти. Нужен потоковый разбор, а не больше памяти.
Можно ли посмотреть только первые записи большого файла?
У обычного JSON — нет, разбор всё равно идёт целиком. У JSON Lines — да, это его главное достоинство.