9

使用 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));
  });

});
4

3 回答 3

5

正如@freakish 提到的,问题是我的数据太大了。

数据如此之大的原因是由于大量图像作为对象返回。最后,我需要做的就是使用缓冲区将对象编码为 base64,然后数据的大小变得更易于管理。

于 2012-06-26T12:02:12.083 回答
2

斯蒂芬的数据不是“太大”。这是 Node 中的一个错误,在此处进行了跟踪,并没有完全修复。2 年后我仍然看到它,具有恒定复杂性的对象有时会产生 OOM 错误,但大部分时间都成功写入磁盘。

一种解决方法是研究使用流式 JSON 编写器库,如json-write(来自 D3 作者 Mike Bostock)。

于 2019-10-25T01:14:09.167 回答
1

一些事情正在递归地发生。

确保您的 Objectdata不包含任何循环引用,例如 tothis或任何其他难以序列化的内容。

于 2012-06-25T13:08:02.467 回答