2012-06-25 6 views
6

Con il nodo, sto cercando di raccogliere i dati utente da un server LDAP e quindi di scrivere tali dati in un file JSON. Sto usando il seguente codice per fare questo:In Node.js che utilizza i risultati JSON.stringify nell'errore 'process out of memory'

fs.writeFile('data.json', JSON.stringify(data, null, 4)); 

Il problema è il metodo JSON.stringify sta causando il seguente errore:

FATAL ERROR: JS Allocation failed - process out of memory 

So che il problema è con JSON.stringify perché se uso console.log piuttosto che fs.writeFile Ho lo stesso errore.

Sto provando a scrivere molti dati (oltre 500 voci nel database LDAP). Qualcuno sa come posso farlo funzionare? Ecco il codice per intero:

var ldap = require('ldapjs'); 
var util = require('util'); 
var fs = require('fs'); 
var client = ldap.createClient({ 
    url: '************' 
}); 

client.bind('CN=**********,OU=Users,OU=LBi UK,OU=UK,DC=********,DC=local', '*********', function(err) { 
    if (err) { 
    console.log(err.name); 
    } 
}); 


// taken from http://ldapjs.org/client.html 
client.search('OU=Users,OU=******,OU=UK,DC=******,DC=local', { 
    scope: 'sub', 
    filter: 'objectClass=organizationalPerson', 
    attributes: ['givenName', 'dn', 'sn', 'title', 'department', 'thumbnailPhoto', 'manager'] 
    // filter by organizational person 
}, function(err, res) { 
    if (err) { 
    console.log(err.name); 
    } 

    var limit = 1; 
    var data = {"directory": []}; 

    res.on('searchEntry', function(entry) { 

    var obj = {}; 
    entry.attributes.forEach(function (attribute) { 
     var value; 
     if (attribute.type === 'thumbnailPhoto') { 
     value = attribute.buffers[0]; 

     } else { 
     value = attribute.vals[0]; 
     } 
     obj[attribute.type] = value; 
    }); 
    data.directory.push(obj); 
    }); 
    res.on('error', function(err) { 
    console.log('error: ' + err.message); 
    }); 
    res.on('end', function(result) { 
    fs.writeFile('data.json', JSON.stringify(data, null, 4)); 
    }); 

}); 
+1

Hai pensato che ... hai esaurito la memoria? :) I.e. i dati sono troppo grandi? – freakish

+0

@freakish Non sono sicuro che sia così perché so che qualcun altro è stato in grado di scrivere i dati su un file. Tuttavia, quando gli ho spiegato che stavo ottenendo questo errore, ha detto che non si era imbattuto in questo problema. C'è un modo per aumentare la quantità di memoria disponibile? –

+0

Sì, compra più RAM. :) O uccidi altre app. L'altra persona ha fatto questo sulla stessa macchina? In caso contrario, non è possibile confrontarlo. Penso che sia così semplice: sei fuori dalla memoria. Per gestire questo problema (senza ottenere effettivamente più RAM), è necessario dividere i dati in parti più piccole e gestire un pezzo alla volta. – freakish

risposta

4

Come @freakish ha menzionato il problema, i miei dati erano troppo grandi.

Il motivo per cui i dati erano così grandi era dovuto a un numero elevato di immagini che venivano restituite come oggetti. Alla fine tutto quello che dovevo fare era codificare l'oggetto come base64 usando Buffer e quindi la dimensione dei dati diventava molto più gestibile.

1

Qualcosa si muove in modo ricorsivo.

Assicurarsi che l'oggetto data non contenga riferimenti circolari, come ad esempio this o qualsiasi altra cosa che presenta problemi di serializzazione.

+4

'JSON.stringify' dovrebbe causare' TypeError: Converting structure structure to JSON' se la struttura ha riferimenti circolari. – Esailija

+0

@Esailija: Deve essere letteralmente un problema di memoria allora. – Jivings

+0

Non penso sia così. Le strutture circolari generano 'TypeError' quando si tenta di comprimerle. – freakish