首页 > 解决方案 > 使用节点中的大型媒体文件一次发出多个发布请求时的内存问题

问题描述

我正在尝试使用request和上传大型媒体文件bluebird。这是我的代码

 const options = {
   url: 'someuploadurl',
   method: 'POST',
   json: true, 
   headers: { 
   Authorization: 'Bearer access_token', 
    'Content-Type': 'multipart/form-data'
   },
   formData: {
     file: {
      value: mediaData, 
      options: { filename: 'myMedia.mp4', contentType: 'video/mp4'}
     }
   }  
 }

const uploadFunction = (options) => {
   new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if(error){
        reject(error)
      }
      resolve(body)
    })
  }).then(console.log).catch(console.log)
}

const sendMultipleRequests = () => {
  const totalRequests = [1, 2, 3, 4, 5, 6, 7, 8]
  // make 8 requests at once
  blueBird.map(totalRequests, () => {
    uploadFunction(options)
  })
}

此代码在totalRequests.length3 或更少时有效。当所有媒体文件都很小(< 2-3mb)但当媒体文件很大(> 30mb)时,代码也可以工作,它会破坏代码并给出错误Socket hang up

我看到了我的系统的内存使用情况,随着请求的增加内存使用量的增加,该进程占用了整个 RAM 内存,然后代码崩溃并出现错误。

请指导我使此代码正常工作,或者您可以共享任何其他方式来上传适用于该场景的媒体。

标签: file-uploadrequestbluebirdlarge-data

解决方案


您需要根据正在运行的系统可以处理的数量来限制并发请求的数量。

blueBird.map(totalRequests, () => uploadFunction(options), { concurrency: 3 })

推荐阅读