Оптимизация анализа файлов и публикации SNS sh большого набора записей - PullRequest
1 голос
/ 27 марта 2020

У меня есть файл данных 85 МБ с 110k текстовыми записями в нем. Мне нужно проанализировать каждую из этих записей и опубликовать sh сообщение SNS в topi c для каждой записи. Я делаю это успешно, но функция Lambda требует много времени для запуска, а также большой объем памяти. Примите во внимание следующее:

const parse = async (key) => {

    //get the 85mb file from S3. this takes 3 seconds
    //I could probably do this via a stream to cut down on memory...
    let file = await getFile( key );

    //parse the data by new line
    const rows = file.split("\n");

    //free some memory now
    //this free'd up ~300mb of memory in my tests
    file = null;

    //
    for( let i = 0; i < rows.length; i++ ) {

        //... parse the row and build a small JS object from it

        //publish to SNS. assume publishMsg returns a promise after a successful SNS push
        requests.push( publishMsg(data) );
    }


    //wait for all to finish
    await Promise.all(requests);
    return 1;

};

Функция Lambda отключит этот код на 90 секунд (текущий предел, который я установил). Я мог бы поднять этот лимит, а также память (в настоящее время на 1024 МБ) и, вероятно, решить мою проблему. Но ни один из опубликованных SNS sh вызовов не происходит, когда функция достигает времени ожидания. Почему?

Допустим, 10 тыс. Строк обрабатываются до того, как функция достигнет времени ожидания. Поскольку я отправляю publi sh asyn c, не должны ли некоторые из них завершиться независимо от времени ожидания? Кажется, они запускаются только после завершения всей функции.

Я провел тест, в котором я сократил данные до 15 тыс. Строк, и он запускается без проблем примерно за 15 секунд.

Итак, вопрос, почему вызовы asyn c не срабатывают до истечения времени ожидания функции, и какие-либо сведения о том, как я могу оптимизировать это, не отходя от Lambda?

Lambda Config: nodeJS 10.x , 1024 МБ, время ожидания 90 секунд

...