0
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是一个测试密码的功能,我下载了一个有大量行的弱密码字典,所以我寻找读取这么多行弱密码的方法密码,但是上面的代码,lines数组变得太大,内存不足,我该怎么办?

4

1 回答 1

0

就我有限的理解而言,您需要注意 1GB 的限制,我认为这实际上是由 V8 引擎强加的。(这是一个链接,实际上说当前限制为 1.4 GB,并列出了用于手动更改此设置的不同参数。)根据您托管节点应用程序的位置,您可以通过设置的参数来增加此限制节点启动时的命令行。同样,请参阅链接的文章以了解执行此操作的几种方法。

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

实际上,一件事没有意义,而且在您的应用程序中似乎效率很低,那就是,在读取每个数据块时,您然后将您的用户名与迄今为止积累的每个用户名核对,你的行数组,而不是最后一个。您的应用应该做的是跟踪您读入的最后一个用户名和密码组合,然后删除该用户之前的所有数据,在您的remaining变量中,这样您就可以节省内存。而且由于它不再是密码文件每一行的全部存储库,因此您可能应该将其重新命名为类似buffer或其他内容。这意味着您将删除您的for循环,因为您已经“循环”通过密码文件中的数据,通过逐块读取它。

于 2013-10-03T14:40:20.060 回答