IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Process out of memory


Sujet :

NodeJS

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut Process out of memory
    Salut à tous,

    Je commence par vous expliquez ce que je veux faire :
    J'ai aspiré les données des rues sur open street map et enregistré sur une base spatialite que je nome «IDF.db».

    A partir de cette base, j'essaye de les indexer sur Elasticsearch à l'aide d'un script Node JS suivant :

    http://pastie.org/10115858

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    var sqlite = require('spatialite');
    var db = new sqlite.Database('IDF.db');
    var query = "SELECT name, AsGeoJSON(geom) as geojson from minor_roads UNION SELECT name, AsGeoJSON(geom) as geojson from major_roads;";
    var i =0;
    var elasticsearch = require('elasticsearch');
    var client = new elasticsearch.Client({
      host: 'localhost:9200',
      //og: 'trace',
      requestTimeout : 3600000,
      deadTimeout : 3600000,
    });
    db.spatialite( function(err){
    	db.all(query, function(err, row){
    		var geojson;
    		var i=0;
    		for(i = 0; i< row.length; i++){
    			geojson = JSON.parse(row[i].geojson);
    			geojson.name = row[i].name;
    			console.log(row[i].id + " " +row[i].name);
    	  		//console.log(geojson);
    			client.index({
    			  	index: 'e42',
    			  	type: 'roads',
    			  	//id: i+1,
    			  	body: geojson,
    			}, function (error, response) {
    			 	console.log(response);
    				if(typeof error === undefined){
    					console.log(error);
    					//process.exit(1);
    				}
    	 		});
    		}
    	});
    });
    Malheureusement, le script me revoie une erreur disant que node js à crasher !!! :/

    FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
    Abandon (core dumped)
    Mon analyse :

    Je soupçonne que la pile d'appel de fonction est saturée. En effet j'ai 356235 lignes sur ma base.
    Comme node js est asynchrone, je suppose que le problème vient des multiple appels en parallèle de Client.Index(…..).

    Donc je voudrais savoir comment rendre cette partie du code, à savoir Client.index, séquentielle afin de ne pas saturer la mémoire.

    Merci d'avance.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Par défaut
    Pourquoi ne pas faire un "db.each(query" au lieu de "db.all(query" ?

    Sinon tu peux utiliser la fonction eachSeries de la lib async.js

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut
    peut-tu m'aider, je ne sais pas trop comment je doit structurer la chose merci

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Par défaut
    Citation Envoyé par idir.ait Voir le message
    peut-tu m'aider, je ne sais pas trop comment je doit structurer la chose merci
    bha, sur le sitede node-spatialite, l'exemple d'usage indique ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    db.spatialite(function(err) {
      db.each(query, function(err, row) {
        console.log(row.geojson);
      });
    });
    du coup, tu vire ta boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    var sqlite = require('spatialite');
    var db = new sqlite.Database('IDF.db');
    var query = "SELECT name, AsGeoJSON(geom) as geojson from minor_roads UNION SELECT name, AsGeoJSON(geom) as geojson from major_roads;";
    var i =0;
    var elasticsearch = require('elasticsearch');
    var client = new elasticsearch.Client({
      host: 'localhost:9200',
      //og: 'trace',
      requestTimeout : 3600000,
      deadTimeout : 3600000,
    });
    db.spatialite( function(err){
        db.each(query, function(err, row){
           var geojson = JSON.parse(row.geojson);
                geojson.name = row.name;
                console.log(row.id + " " +row.name);
     
                client.index({
                      index: 'e42',
                      type: 'roads',
                      body: geojson,
                }, function (error, response) {
     
                    if(error){
                        console.log(error);
                    }
                 });
            }
        });
    });
    Par contre tu ne gère pas la sortie de ta boucle... donc avec async:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    var sqlite = require('spatialite');
    var db = new sqlite.Database('IDF.db');
    var query = "SELECT name, AsGeoJSON(geom) as geojson from minor_roads UNION SELECT name, AsGeoJSON(geom) as geojson from major_roads;";
    var i =0;
    var elasticsearch = require('elasticsearch');
    var async = require('async');
     
    var client = new elasticsearch.Client({
      host: 'localhost:9200',
      //og: 'trace',
      requestTimeout : 3600000,
      deadTimeout : 3600000,
    });
     
    function indexIt(row, cb) {
           var geojson = JSON.parse(row.geojson);
                geojson.name = row.name;
                console.log(row.id + " " +row.name);
     
                client.index({
                      index: 'e42',
                      type: 'roads',
                      body: geojson,
                }, function (error, response) {
                    if (error)  console.log(error);
                    cb(error, response )
                });
    }
     
    db.spatialite( function(err){
        db.all(query, function(err, rows){
            if (err) throw err;
     
            async.eachSeries(rows, indexIt, function(error) {
                if (err)  throw err;
                console.log('All files have been processed successfully');
            });
     
        });
    });

Discussions similaires

  1. Réponses: 12
    Dernier message: 09/08/2007, 12h48
  2. Réponses: 2
    Dernier message: 09/08/2007, 12h35
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo