首页 > 解决方案 > 优化大型记录集的文件解析和SNS发布

问题描述

我有一个 85mb 的数据文件,里面有 110k 的文本记录。我需要解析每条记录,并将 SNS 消息发布到每条记录的主题。我这样做很成功,但是 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 秒时使用此代码超时(我设置的当前限制)。我可以提高这个限制以及内存(目前为 1024mb),并可能解决我的问题。但是,当函数超时时,不会发生任何 SNS 发布调用。为什么?

假设在函数超时之前处理了 10k 行。由于我正在提交异步发布,因此无论超时如何,这些都不应该完成吗?似乎它们仅在整个功能完成时才运行。

我已经运行了一个测试,我将数据减少到 15k 行,并且它在大约 15 秒内运行没有任何问题。

那么问题来了,为什么异步调用在函数超时之前没有触发,以及关于如何在不离开 Lambda 的情况下优化它的任何输入?

Lambda 配置:nodeJS 10.x,1024 mb,90 秒超时

标签: node.jsasynchronousaws-lambdaamazon-sns

解决方案


推荐阅读