Создать большой объект json js

Я использую Nodejs для создания файла JSON из действительно большого объекта JSON (1 ГБ). Чтобы избежать проблем с памятью, я использую createWriteStream :

var writeStream = fs.createWriteStream('./output/outPut.json')

После использования Builder (пользовательская функция) он вернет большой объект JSON.

Последний шаг - создать этот файл:

 writeStream.write(JSON.stringify(search_index), (err) => {
             if (err) throw err
             console.info('File  Ready... ')
                    })

Но, к сожалению, JSON.stringify нельзя использовать с таким тяжелым объектом.

JSON.stringify выдает RangeError: недопустимая длина строки для огромных объектов

Подскажите, пожалуйста, есть ли решение этой проблемы?

Какова цель создания такого большого файла. Можете ли вы разделить информацию на более мелкие файлы?

Craicerjack 20.12.2020 22:35

@Craicerjack Я использую elasticlunr JS для создания модуля поиска в своем приложении, и этот файл является поисковым индексом, к сожалению, его нельзя разделить на несколько файлов.

ben ftima wajdi 20.12.2020 22:38

Отвечает ли это на ваш вопрос? Парсинг большого файла JSON в Nodejs

Rishabh Deep Singh 20.12.2020 22:38

@RishabhDeepSingh, этот ответ о том, как читать большой JSON, а не создавать его

ben ftima wajdi 20.12.2020 22:40

SearchIndex массив или объект?

Bergi 20.12.2020 23:54
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
3
5
4 123
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

При записи больших наборов данных в файлы (т. е. большого количества документов в поисковом индексе) обычно лучше работать с меньшими пакетами, чтобы найти баланс между потреблением памяти и временем вычислений.

Например, вы можете создать 100 объектов JavaScript (n = 100), stringify их, добавить в свой файл и продолжить со следующими 100 объектами.

Хитрость здесь заключается в том, чтобы определить размер пакета n, который эффективно использует память вашей системы, не тратя слишком много времени на операции чтения/записи файлов.

Распространенной ошибкой является то, что общее количество ваших документов может не быть целым числом, кратным размеру вашего пакета n. При повторении с использованием индексной переменной с отсчетом от нуля вы должны записать в файл, если:

Index % n === 0 || index === (totalCount - 1)

Дополнительным преимуществом является то, что вы можете запустить/перезапустить этот процесс после ошибки без необходимости воссоздавать все данные (т. е. если какая-то ошибка возникает после записи 800 МБ данных, вы можете зарегистрировать последний успешный индекс и продолжить оттуда).

Поток записи бесполезен, если вы записываете только одну большую строку. Вы не можете использовать родной JSON.stringify здесь. Однако существует довольно много доступных библиотек, которые будут реализовывать сериализацию JSON в поток (и даже больше для десериализации из потока), используйте одну из них.

Ответ принят как подходящий

Первый шаг - инициализировать объект потока.

const writeStream = fs.createWriteStream('./object.json', { flags: 'w' })

Затем преобразование моих данных в строку JSON (stringify) Использование модуля JSON Stream Stringify

const JsonStreamStringify = require('json-stream-stringify')
const jsonStream = new JsonStreamStringify(Promise.resolve(Promise.resolve(TargetData)))

Последний шаг — передать возвращенные данные в writeStream.

jsonStream.pipe(writeStream)
jsonStream.on('end', () => console.info('done '))

Но это может занять много времени в моем случае 10-15 мин (1,1 Гб)

Другие вопросы по теме