node.js - 优化大型记录集的文件解析和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 秒超时
解决方案
推荐阅读
- c++ - 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- r - igraph 的情节:如何突出显示一组顶点
- python-3.x - 在 Python 中导入加密的 Cython 模块
- cakephp - 如何在cakephp上访问多个关系
- python - UNIQUE 约束失败:auth_user.username 完整性错误
- java - NestedScrollView 中的 Viewpager 不滚动
- typescript - '{ action: string; 类型的参数 过期:字符串;}' 不可分配给“GetSignedUrlConfig”类型的参数
- reactjs - 如何在 React with Jest 中测试这条线?
- reactjs - Reacts JS-mdb 反应表分页
- javascript - 两个音频文件一个一个播放