Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Node.js中,使用JSON.stringify会导致';进程内存不足';错误_Json_Node.js_Ldap - Fatal编程技术网

在Node.js中,使用JSON.stringify会导致';进程内存不足';错误

在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

使用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.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,你似乎不明白。您有足够的内存来保存对象并检查它,但字符串化实际上会在内存中创建一个新字符串。因为您的数据足够大,所以这个字符串不能放入内存中。更改库对您没有帮助,因为最终您希望在内存中保留大字符串。你不应该。正如我告诉过你的:你必须把数据分成更小的部分,把这些部分串起来,然后一块一块地附加到一个文件中。当然我可能错了,但我看不出其他合乎逻辑的解释。