2012-06-25 9 views
6

Con nodo Estoy tratando de recopilar datos de usuario de un servidor LDAP y luego escribir esos datos en un archivo JSON. Estoy utilizando el siguiente código para hacer esto:En Node.js usando JSON.stringify resultados en el error 'proceso sin memoria'

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

El problema es el método JSON.stringify está causando el error siguiente:

FATAL ERROR: JS Allocation failed - process out of memory 

Sé que el problema es con JSON.stringify porque si uso console.log en lugar de fs.writeFile Me sale el mismo error.

Estoy tratando de escribir una gran cantidad de datos (más de 500 entradas en la base de datos LDAP). ¿Alguien sabe cómo puedo hacer que esto funcione? Aquí está el código completo:

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

¿Consideras que ... te has quedado sin memoria? :) Es decir la información es demasiado grande? – freakish

+0

@freakish No estoy seguro si ese es el caso porque sé que alguien más pudo escribir los datos en un archivo. Sin embargo, cuando le expliqué que estaba recibiendo este error, me dijo que no había encontrado este problema. ¿Hay alguna manera de aumentar la cantidad de memoria disponible? –

+0

Sí, compre más RAM. :) O matar a otras aplicaciones. ¿La otra persona hizo esto en la misma máquina? Si no, entonces no puedes compararlo. Creo que esto es tan simple como eso: te has quedado sin memoria. Para manejar este problema (sin realmente obtener más RAM), necesita dividir los datos en piezas más pequeñas y manejar una pieza a la vez. – freakish

Respuesta

4

Como @freakish mencionó el problema era que mis datos eran demasiado grandes.

La razón por la que los datos eran tan grandes se debía a la gran cantidad de imágenes que se devolvían como objetos. Al final, todo lo que tenía que hacer era codificar el objeto como base64 usando Buffers y luego el tamaño de los datos se volvió mucho más manejable.

1

Algo está sucediendo recursivamente.

Asegúrese de que su Objeto data no contiene ninguna referencia circular, como this o cualquier otra cosa que tenga dificultades para ser serializada.

+4

'JSON.stringify' debería causar' TypeError: Conversión de estructura circular a JSON' si la estructura tiene referencias circulares. – Esailija

+0

@Esailija: Literalmente debe ser un problema de memoria. – Jivings

+0

No creo que sea el caso. Las estructuras circulares arrojan 'TypeError' cuando intentas escribirlas. – freakish

Cuestiones relacionadas