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.