我应该如何使用nodejs避免内存不足?

时间:2013-10-03 14:34:19

标签: node.js

var  pass = require('./pass.js');
var  fs   = require('fs');
var path  = "password.txt";
var name  ="admin";
var
  remaining = "",
  lineFeed = "\r\n",
  lineNr = 0;

var log = 
  fs.createReadStream(path, { encoding: 'utf-8' })
  .on('data', function (chunk) {
    // store the actual chunk into the remaining
    remaining = remaining.concat(chunk);

    // look that we have a linefeed
    var lastLineFeed = remaining.lastIndexOf(lineFeed);

    // if we don't have any we can continue the reading
    if (lastLineFeed === -1) return;

    var
      current = remaining.substring(0, lastLineFeed),
      lines = current.split(lineFeed);

    // store from the last linefeed or empty it out
    remaining = (lastLineFeed > remaining.length)
      ? remaining.substring(lastLineFeed + 1, remaining.length)
      : "";

    for (var i = 0, length = lines.length; i < length; i++) {
      // process the actual line
      var account={
        username:name,
        password:lines[i],
      };
      pass.test(account);
    }
  })
  .on('end', function (close) {
    // TODO I'm not sure this is needed, it depends on your data
    // process the reamining data if needed
    if (remaining.length > 0) {
        var account={
            username:name,
            password:remaining,
        };
         pass.test(account);
    };
  });

我尝试做一些像帐号“admin”的测试密码, pass.test 是一个测试密码的函数,我下载了一个包含大量行的弱密码字典,所以我搜索方式读取那么多行弱密码,但是上面的代码,行数组变得太大了,内存耗尽了,我该怎么办?

1 个答案:

答案 0 :(得分:0)

就我的有限理解而言,你需要观察1GB的限制,我认为这实际上是由V8引擎强加的。 (Here's a link,实际上说当前限制为1.4 GB,并列出了用于手动更改此值的不同参数。)根据您托管节点应用程序的位置,您可以通过参数增加此限制在节点启动时在命令行上设置。再次,请参阅链接文章,了解几种方法。

此外,您可能希望确保尽可能使用缓冲区,而不是将数据流(例如,从数据库或其他内容)转换为数组/其他内容,因为这将加载整个数据集到内存中。只要它存在于缓冲区中,它就不会影响应用程序的总内存占用量。

实际上,有一点没有意义,而且在您的应用中似乎非常效率低下,就是在读取每个数据块时,您会检查您的用户名到目前为止您已经积累的每个用户名,在您的行数组中,而不是最后。您的应用应该做的是跟踪您已读入的最后一个用户名和密码组合,然后在remaining变量中删除此用户之前的所有数据,以便保持记忆力。而且,由于它不再是密码文件的每一行的所有存储库,您应该重新标记buffer之类的内容。这意味着您将删除for循环,因为您已经通过密码文件中的数据“循环”,通过读取块,chunk by chunk。