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 是一个测试密码的函数,我下载了一个包含大量行的弱密码字典,所以我搜索方式读取那么多行弱密码,但是上面的代码,行数组变得太大了,内存耗尽了,我该怎么办?
答案 0 :(得分:0)
就我的有限理解而言,你需要观察1GB的限制,我认为这实际上是由V8引擎强加的。 (Here's a link,实际上说当前限制为1.4 GB,并列出了用于手动更改此值的不同参数。)根据您托管节点应用程序的位置,您可以通过参数增加此限制在节点启动时在命令行上设置。再次,请参阅链接文章,了解几种方法。
此外,您可能希望确保尽可能使用缓冲区,而不是将数据流(例如,从数据库或其他内容)转换为数组/其他内容,因为这将加载整个数据集到内存中。只要它存在于缓冲区中,它就不会影响应用程序的总内存占用量。
实际上,有一点没有意义,而且在您的应用中似乎非常效率低下,就是在读取每个数据块时,您会检查您的用户名到目前为止您已经积累的每个用户名,在您的行数组中,而不是最后。您的应用应该做的是跟踪您已读入的最后一个用户名和密码组合,然后在remaining
变量中删除此用户之前的所有数据,以便保持记忆力。而且,由于它不再是密码文件的每一行的所有存储库,您应该重新标记buffer
之类的内容。这意味着您将删除for
循环,因为您已经通过密码文件中的数据“循环”,通过读取块,chunk by chunk。