在Node.js中,使用JSON.stringify会导致';进程内存不足';错误
使用Node,我试图从LDAP服务器收集用户数据,然后将数据写入JSON文件。我正在使用以下代码执行此操作:在Node.js中,使用JSON.stringify会导致';进程内存不足';错误,json,node.js,ldap,Json,Node.js,Ldap,使用Node,我试图从LDAP服务器收集用户数据,然后将数据写入JSON文件。我正在使用以下代码执行此操作: 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.wr
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));
});
});
有些事情在反复发生
确保您的对象
数据
不包含任何循环引用,例如指向此
或任何其他难以序列化的对象。正如@freakish提到的,问题是我的数据太大
数据之所以如此庞大,是因为有大量图像作为对象返回。最后,我需要做的就是使用缓冲区将对象编码为base64,然后数据的大小变得更易于管理。斯蒂芬的数据并不“太大”。这是节点中的一个bug,已被跟踪,尚未完全修复。两年后我仍然看到它,一个不断复杂的对象有时会产生OOM错误,但大部分时间都成功地写入磁盘
一种解决方法是研究使用流式JSON编写器库,如(来自D3作者Mike Bostock)。
JSON。stringify
应该会导致TypeError:如果结构具有循环引用,则将循环结构转换为JSON
。@Esailija:那一定是内存问题。我不认为是这种情况。圆形结构抛出<代码> TypeError < /代码>当你试图严格化它们时,你是否认为…您的内存不足?:)也就是说,数据太大了?@freakish我不确定情况是否如此,因为我知道有人能够将数据写入文件。然而,当我向他解释我犯了这个错误时,他说他没有遇到这个问题。有什么方法可以增加可用内存量吗?是的,购买更多内存。:)或者杀死其他应用程序。另一个人是在同一台机器上做的吗?如果不是,那么你就无法进行比较。我认为这很简单:你没有记忆了。要处理这个问题(实际上没有获得更多RAM),您需要将数据分割成更小的部分,然后一次处理一部分。@freakish我刚刚尝试使用console.log(util.inspect(data))代码>而不是fs.writeFile
,我能够在控制台中显示数据,没有问题。我可以用JSON.stringify来写这个文件吗?Stephen,你似乎不明白。您有足够的内存来保存对象并检查它,但字符串化实际上会在内存中创建一个新字符串。因为您的数据足够大,所以这个字符串不能放入内存中。更改库对您没有帮助,因为最终您希望在内存中保留大字符串。你不应该。正如我告诉过你的:你必须把数据分成更小的部分,把这些部分串起来,然后一块一块地附加到一个文件中。当然我可能错了,但我看不出其他合乎逻辑的解释。