2012-06-25 42 views
6

使用節點我試圖從LDAP服務器收集用戶數據,然後將該數據寫入JSON文件。我使用下面的代碼來做到這一點:在使用JSON.stringify的Node.js中導致'進程內存不足'錯誤

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

問題是JSON.stringify方法引起以下錯誤:

FATAL ERROR: JS Allocation failed - process out of memory 

我知道這個問題是與JSON.stringify,因爲如果我用console.log,而不是fs.writeFile我得到同樣的錯誤。

我想寫很多數據(在LDAP數據庫中超過500個條目)。有誰知道我可以如何讓這個工作?以下是代碼全部:

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

你是否認爲......你內存不足? :) I.e.數據太大? – freakish

+0

@freakish我不確定是否屬於這種情況,因爲我知道其他人能夠將數據寫入文件。然而,當我向他解釋我遇到這個錯誤時,他說他沒有遇到這個問題。有沒有辦法增加可用的內存量? –

+0

是的,購買更多的內存。 :)或殺死其他應用程序。另一個人在同一臺機器上做過這個嗎?如果不是,那麼你無法比較它。我認爲這很簡單:你內存不足。爲了解決這個問題(實際上並沒有獲得更多的RAM),你需要將數據拆分成小塊,並一次處理一塊。 – freakish

回答

4

作爲@freakish提到的問題是我的數據太大。

數據如此之大的原因是由於大量圖像被作爲對象返回。最後,我需要做的就是使用Buffers將對象編碼爲base64,然後數據的大小變得更易於管理。

1

遞歸地發生了一些事情。

確保您的對象data不包含任何循環引用,例如this或其他任何難以序列化的內容。

+4

如果結構具有循環引用,則'JSON.stringify'應該導致'TypeError:將循環結構轉換爲JSON'。 – Esailija

+0

@Esailija:那肯定是一個記憶問題。 – Jivings

+0

我不認爲是這樣。當你嘗試對它們進行字符串化時,圓形結構會拋出「TypeError」。 – freakish

相關問題