Повышение производительности загрузки огромного JSON в NodeJS

#node.js #json #performance

#node.js #json #Производительность

Вопрос:

У меня ситуация, когда мне нужно загрузить огромный объект JSON (4,5 ГБ открытого и 400 МБ сжатого) из S3.
В настоящее время это выполняется с потоковой передачей, аналогичной следующему коду:

 let result = S3.getObject(getBatchParams)
               .createReadStream()
               .pipe(gunzipExtractor)
               .pipe(JSONStream.parse())
               .on('data', objectData => {return resolve(objectData)}
  

Загрузка JSON занимает несколько минут.
Я ищу способы сократить это время.
Такие вещи, как различные методы загрузки, библиотеки, флаги V8 GC или любая другая техника.
Текущий процесс загрузки привязан к процессору (процесс узла на 100% состоит из ЦП в течение всего процесса загрузки)
Я знаю, что загрузка такого json — плохая идея, для начала 🙂

Комментарии:

1. Сначала нужно выяснить, где находится ваше узкое место. При 100%-ной загрузке процессора виновником, скорее всего, является декомпрессия, поэтому вы можете попробовать поискать более эффективные библиотеки декомпрессии.

2. Спасибо, я протестировал версию, считываемую из локального файла без сжатия, и время аналогично, поэтому я предполагаю, что большая часть времени тратится на выделение огромного объекта. @RobbyCornelissen

3. Похоже, вам было бы намного лучше анализировать JSON в виде потока и добавлять его в базу данных по ходу работы, не пытаясь постоянно хранить все это в памяти. Затем, с этого момента, используйте его из базы данных, а не из JSON. 4,5 ГБ данных, вероятно, принадлежат базе данных, а не одному объекту Javascript. Гигантские объемы данных в памяти — это не то, в чем Javascript особенно хорош, так как сам процесс первоначального синтаксического анализа, скорее всего, будет потреблять много памяти и приведет к большому количеству GC, связанных со всеми временными строками, участвующими в синтаксическом анализе.