0

私は現在、ユーザー入力を受け取り、トレーニングデータで単語が何回発生したかに基づいて、ユーザーのコメントが属していた可能性のある最上位のサブレディットを返す関数を作成しようとしています。さまざまなサブレディットの単語の頻度を含むデータベースがあり、各サブレディットとユーザー入力のすべての単語に対して GET リクエストを作成しています。

私のデータベースには 7000 以上のサブレディットがあるので、これは多くの get リクエストを追加します。現在、すべてのサブレディットのリストを取得するために、要求と約束 (浅い) 要求を行っています。次に、subreddit ごとに、ユーザー入力の各単語をループし、別の request-promise オブジェクトを作成して、それを promise の配列に追加します。

すべての request-promise オブジェクトが追加されたら、Promise.all を使用してそれらがすべて解決されるまで待ちます。次に、指定された subreddit の単語頻度の配列を出力しようとしますが、「エラー: EMFILE に接続してください」というメッセージが表示されます。 .

スタック オーバーフローに関する別の投稿によると、これは開いているソケットが多すぎることを意味しますが、それがどのように発生するかについては混乱しています。私の理解では、 Promise.all が解決するのを待っている間に実行されるリクエストであるため、一度に最大で user_words.length の接続が開かれることはありませんか? 接続が閉じられていない方法がわかりません。

助けてくれてありがとう!

function getBestSubreddit(messageText) {
  var user_words = parse_message(messageText);
  var top_subreddit = "";
  var top_score = Number.MIN_SAFE_INTEGER;
  rp(dbUrl + '/.json?shallow=true').then(function(res) {
    res = JSON.parse(res);
    for (var subreddit in res) {
      if (res.hasOwnProperty(subreddit)) {
        var score = 0.0;
        var promises = []
        for (var i = 0; i < user_words.length; i++) {
          promises.push(rp(dbUrl + '/' + subreddit + '/word_freqs/' + user_words[i] + '.json'));
        }
        Promise.all(promises).then(function(values) {
          console.log(values);
        }, function(err) {
          console.log(err);
        });
      }
    }
  }).catch(function(err) {
    console.log(err);
  })
  return top_subreddit;
}
4

2 に答える 2