Может ли узел JS сделать это?

#node.js #arrays #json

Вопрос:

У меня есть каталог с примерно 50 файлами JSON. Размер каждого файла составляет от 15 до 25 МБ. Все эти файлы содержат массивы объектов json со следующей общей структурой:

 [
{"":"","":"","":["","",""]},
{"":"","":"","":["","",""]},
{"":"","":"","":["","",""]},
...
]
 

Мне нужно прочитать все эти файлы, а затем разделить эти файлы на отдельные массивы примерно по 50 объектов в каждом, а затем записать эти массивы в их собственные отдельные файлы. Поэтому мне в основном нужно взять один огромный массив в 1 файле и разрезать этот массив на множество меньших массивов и поместить эти меньшие массивы в их собственные отдельные файлы… Мне нужно уменьшить размер файла примерно до 1 МБ каждый.

У меня возникли проблемы с отдельной частью файла, я, кажется, не могу понять, как запустить цикл, чтобы ВСЕ файлы были записаны. Мне удалось записать до 5 файлов, но не все. Должно быть около 15 файлов, просто зависит от того, сколько объектов в огромном массиве.

На моей локальной машине(Ubuntu 20.04) 16 ГБ оперативной памяти, и я запускаю NodeJS v14x.

Почему он перестает писать после 5 файлов, это проблема с памятью или мой код неправильный?

 const fs = require('fs');
const testfolder = './parse-testing/';
const fileNumbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40];

fs.readdir(testfolder, (err, files) => {
  files.forEach(file => {
    const articlesRaw = fs.readFileSync(file, 'utf8');
    console.log('file is: ', file);
    const articles = JSON.parse(articlesRaw);
    console.log('array length is: ', articles.length);

    const chunk = 50;
    for (let i = 0; i <= articles.length; i  = chunk) {      
      let slicedArticles = articles.slice(i, i   chunk);
      let newArticlesArray = JSON.stringify(slicedArticles);
      
      while (articles.length !== null || undefined) {
        [newArticlesArray].forEach(newArticleArray => {
          fs.writeFileSync(`./testing-data/articles_testfile_${fileNumbers[i]}.json`, newArticleArray, {encoding: 'utf8'});
        })
      } 
    }
  });
});