如何在NodeJS Request管道上设置最大缓冲区大小?我尝试使用AWS Lambda从source
和管道上传下载到destination
,如下面的代码所示:
request(source).pipe(request(destination))
此代码工作正常,但如果文件大小大于AWS Lambda内存大小(下图),则崩溃。如果我增加内存,它可以工作,所以我知道不是超时或链接,而只是内存分配。最初我没有增加数量,但即使我使用最大数量,仍然是1.5GB,我期望传输大于此的文件。
AWS Lambda上的NodeJS是否有全局变量?还是其他任何建议?
答案 0 :(得分:0)
要考虑的两件事:
“但是,不鼓励流式响应(例如.pipe(...)),因为Request-Promise会增加不必要的大请求的内存占用。为此,请使用原始的Request库。您可以在同一项目。”来源:https://www.npmjs.com/package/request-promise
request.get(sourceUrl,{highWaterMark:1024000,encoding:null})。pipe(request(destinationUrl,{highWaterMark:1024000));
1025000以字节为单位,约为10MB。
highWaterMark背景的来源: “由于双工流和变换流都是可读和可写的,因此每个流维护两个用于读取和写入的独立内部缓冲区,从而允许每一侧在保持适当和有效的数据流的同时彼此独立地进行操作。例如,net.Socket实例是双工流,其“可读取”侧允许使用从套接字接收的数据,而“可写侧”允许将数据写入到套接字。由于数据写入套接字的速度可能比接收数据快或慢,因此对于每一侧都非常重要彼此独立地操作(和缓冲)。” <-这最后一句话很重要。
https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
const油门= require('stream-throttle');
let th =新的节气门。Throttle({rate:10240000}); //如果您不想传输速度超过10mb / sec
request.get(sourceUrl,{highWaterMark:1024000,encoding:null})。pipe(th).pipe(request(destinationUrl,{highWaterMark:1024000));