2013-10-03 2 views
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); 
    }; 
    }); 

Я пытался сделать что-то вроде испытательного пароля учетной записи администратора «», pass.test функции для проверки пароля, загрузить слабый словарь паролей с большим количеством строк, поэтому я искать пути чтобы прочитать, что многие строки слабый пароль, но с кодом выше, массив строк стал слишком большим и закончил память, что мне делать?Как я могу избежать нехватки памяти с помощью nodejs?

+1

Вы должны обрабатывать каждую строку при ее чтении, а не пытаться удерживать все это в памяти. – SLaks

+1

использовать базу данных? – mkoryak

ответ

0

Поскольку мое ограниченное понимание идет, вам нужно посмотреть ограничение 1 ГБ, которое, как мне кажется, навязывается двигателем V8. (Here's a link, на самом деле говоря, что ограничение составляет 1,4 ГБ, в настоящее время и перечисляет различные параметры, используемые для его изменения вручную). В зависимости от того, где вы размещаете свои узловые приложения, вы можете увеличить это ограничение, с помощью набора параметров в команде при запуске узла. Опять же, см. Связанную статью для нескольких способов сделать это.

Кроме того, вы можете убедиться, что, когда это возможно, вы используете буферы вместо того, чтобы преобразовывать такие вещи, как потоки данных (например, из БД или другие вещи) в массивы/что угодно, поскольку это будет загружать весь набор данных в память. Пока он живет в буфере, он не влияет на общий объем памяти вашего приложения.

И на самом деле, одна вещь, которая не имеет смысла, и это, кажется, очень неэффективен в вашем приложении, является то, что при чтении каждой порции данных, вы затем проверить имя пользователя против КАЖДЫЙ имя пользователя вы до сих пор собрали в своем массиве строк, а не LAST. То, что должно делать ваше приложение, - это отслеживать последнее имя пользователя и пароль, которое вы прочитали, а затем удалить все данные перед этим пользователем в переменной remaining, чтобы сохранить свою память. И поскольку он больше не хранит весь репозиторий для каждой строки вашего файла паролей, вы должны, вероятно, переписать его как-то вроде buffer или что-то в этом роде. Это означает, что вы удалите цикл for, так как вы уже «зацикливаетесь» через данные в файле паролей, читая его, куском куска.

+0

Как мне ограничить буфер для загрузки данных, а не загружать все в память один раз? – ggaaooppeenngg

+0

Я хочу сделать что-то «плохое», чтобы войти в мой школьный сайт. Я просто нашел слабый словарь паролей, чтобы попытаться получить полномочия администратора. Я не уверен, что пароль соответствует учетной записи «admin» (я просто знал, что «admin» является действительной учетной записью) – ggaaooppeenngg

+0

@ggaaooppeenngg См. Мои последние комментарии. В принципе, ваш основной недостаток заключается в том, что вы перебираете ** каждое ** имя пользователя/пароль, которое вы накопили до сих пор ** каждый ** время, которое вы читаете в куске. Вместо этого вы должны просто хвататься за куски, когда они приходят, и как только вы получите новое имя пользователя/пароль, вы должны в этом случае «pass.test()» против него и очистить все до этого от ваш 'остаток' var. –

Смежные вопросы