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.logfs.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エラーを生成しますが、ほとんどの場合、ディスクへの書き込みは正常に行われます。

回避策の1つは、 json-write(D3の作成者であるMike Bostockによる)のようなストリーミングJSONライターライブラリの使用を検討することです。

于 2019-10-25T01:14:09.167 に答える
1

何かが再帰的に起こっています。

オブジェクトに、シリアル化が困難なdatatoなどの循環参照が含まれていないことを確認してください。this

于 2012-06-25T13:08:02.467 に答える