Empêcher la fonction Javascript de manquer de mémoire car trop d'objets

Je nodeJS un grattoir Web dans nodeJS qui utilise la request et le cheerio pour analyser le DOM. Alors que j'utilise le node , je crois que c'est plus une question de javascript général.

T-dr-create ~ 60,000 – 100,000 objects, utilise toute la RAM de mon ordinateur, obtenez une erreur out of memory dans le nœud.

Voici comment fonctionne le grattoir. C'est une boucle dans les boucles, je n'ai jamais conçu ce complexe avant alors il pourrait y avoir de meilleures façons de le faire.

Loop 1: Crée 10 objets dans un tableau appelé 'sitesArr'. Chaque objet représente un site Web à gratter.

 var sitesArr = [ { name: 'store name', baseURL: 'www.basedomain.com', categoryFunct: '(function(){ // do stuff })();', gender: 'mens', currency: 'USD', title_selector: 'h1', description_selector: 'p.description' }, // ... x10 ] 

Loop 2: Loops à travers 'sitesArr'. Pour chaque site, il va à la page d'accueil via «demande» et obtient une liste de liens de catégorie, habituellement de 30 à 70 URL. Ajoute ces URL à l'objet actuel 'sitesArr' auquel ils appartiennent, dans une propriété de tableau dont le nom est 'categories'.

 var sitesArr = [ { name: 'store name', baseURL: 'www.basedomain.com', categoryFunct: '(function(){ // do stuff })();', gender: 'mens', currency: 'USD', title_selector: 'h1', description_selector: 'p.description', categories: [ { name: 'shoes', url: 'www.basedomain.com/shoes' },{ name: 'socks', url: 'www.basedomain.com/socks' } // x 50 ] }, // ... x10 ] 

Boucle 3: Boucles à travers chaque «catégorie». Pour chaque URL, il contient une liste de liens de produits et les met dans un tableau. Généralement ~ 300-1000 produits par catégorie

 var sitesArr = [ { name: 'store name', baseURL: 'www.basedomain.com', categoryFunct: '(function(){ // do stuff })();', gender: 'mens', currency: 'USD', title_selector: 'h1', description_selector: 'p.description', categories: [ { name: 'shoes', url: 'www.basedomain.com/shoes', products: [ 'www.basedomain.com/shoes/product1.html', 'www.basedomain.com/shoes/product2.html', 'www.basedomain.com/shoes/product3.html', // x 300 ] },// x 50 ] }, // ... x10 ] 

Loop 4: Loops à travers chacun des matrices 'produits', va à chaque URL et crée un objet pour chacun.

 var product = { infoLink: "www.basedomain.com/shoes/product1.html", description: "This is a description for the object", title: "Product 1", Category: "Shoes", imgs: ['http://foo.com/img.jpg','http://foo.com/img2.jpg','http://foo.com/img3.jpg'], price: 60, currency: 'USD' } 

Ensuite, pour chaque objet de produit, je les upsert à une fonction MongoDB qui effectue un upsert dans ma base de données

LE PROBLÈME

Tout cela a bien fonctionné, jusqu'à ce que le processus ait pris de l'ampleur. Je crée environ 60 000 objets de produits chaque fois que ce script s'exécute, et après un peu de temps, la RAM de mon ordinateur est épuisée. De plus, après avoir parcouru à mi-parcours de mon processus, j'ai l'erreur suivante dans Node :

  FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 

Je suis très conscient qu'il s'agit d'un problème de conception de code. Devrais-je "supprimer" les objets une fois que j'ai fini avec eux? Quelle est la meilleure façon de s'attaquer à cela?