2012-06-25 39 views
6

Với nút Tôi đang cố gắng thu thập dữ liệu người dùng từ máy chủ LDAP và sau đó ghi dữ liệu đó vào tệp JSON. Tôi đang sử dụng đoạn mã sau để làm điều này:Trong Node.js sử dụng JSON.stringify dẫn đến lỗi 'process out of memory'

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

Vấn đề là phương pháp JSON.stringify đang gây ra các lỗi sau:

FATAL ERROR: JS Allocation failed - process out of memory 

tôi biết vấn đề là với JSON.stringify vì nếu tôi sử dụng console.log hơn fs.writeFile Tôi gặp lỗi tương tự.

Tôi đang cố ghi nhiều dữ liệu (hơn 500 mục nhập trong cơ sở dữ liệu LDAP). Có ai biết làm thế nào tôi có thể nhận được điều này để làm việc? Đây là mã đầy đủ:

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

Bạn có nghĩ rằng ... bạn đã hết bộ nhớ? :) I E. dữ liệu quá lớn? – freakish

+0

@freakish Tôi không chắc chắn nếu đó là trường hợp bởi vì tôi biết ai đó khác đã có thể ghi dữ liệu vào một tập tin. Tuy nhiên, khi tôi giải thích cho anh ấy tôi đã nhận được lỗi này, anh ấy nói anh ấy đã không gặp vấn đề này. Có cách nào tôi có thể tăng số lượng bộ nhớ có sẵn không? –

+0

Vâng, mua thêm RAM. :) Hoặc giết các ứng dụng khác. Người khác đã làm điều này trên cùng một máy? Nếu không, thì bạn không thể so sánh nó. Tôi nghĩ rằng điều này đơn giản như thế: bạn đã hết trí nhớ. Để xử lý vấn đề này (không thực sự nhận được nhiều RAM hơn), bạn cần chia nhỏ dữ liệu thành các phần nhỏ hơn và xử lý từng phần một. – freakish

Trả lời

4

Vì @freakish đã đề cập vấn đề là dữ liệu của tôi quá lớn.

Lý do dữ liệu quá lớn là do một số lượng lớn hình ảnh được trả về dưới dạng đối tượng. Cuối cùng, tất cả những gì tôi cần làm là mã hóa đối tượng như base64 bằng Buffers và sau đó kích thước của dữ liệu trở nên dễ quản lý hơn nhiều.

1

Điều gì đó đang diễn ra đệ quy.

Đảm bảo rằng đối tượng data của bạn không chứa bất kỳ tham chiếu vòng tròn nào, chẳng hạn như this hoặc bất kỳ thứ gì khác gặp khó khăn khi được tuần tự hóa.

+4

'JSON.stringify' sẽ gây ra' TypeError: Chuyển đổi cấu trúc hình tròn thành JSON' nếu cấu trúc có tham chiếu vòng tròn. – Esailija

+0

@Esailija: Theo nghĩa đen, nó phải là vấn đề về bộ nhớ. – Jivings

+0

Tôi không nghĩ vậy. Cấu trúc tròn ném 'TypeError' khi bạn cố gắng xâu chuỗi chúng. – freakish

Các vấn đề liên quan