AppEngine*是否可以将超过32MB的数据拉入?

2024-09-29 21:33:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个需要摄取高清视频(至少100MB)的API。我只能通过httpxml提要访问视频,因此只有在获得视频的URL之后,我才能视频(使用GET)。计划是将视频存储在地面军事系统中。在

但在我上传/写入GCS之前,AppEngine中的每个请求限制已达到32MB。在

有没有办法绕过这两个限制:

  1. 必须是AppEngine可以启动的
  2. 需要能够将数据输入地面军事系统

我知道amazons3,如果我必须离开Google云产品,但我不知道它是否可以被配置为可以获取大量数据。在

谢谢。在


Tags: 数据apiurlget视频系统google计划
1条回答
网友
1楼 · 发布于 2024-09-29 21:33:36

按照保罗·柯林伍德的建议,我想出了以下办法。在

我决定不写块到GCS然后把它们缝合在一起。相反,我选择在内存中执行这些操作,但我可能会根据资源成本(必须运行F4@512MB以避免超过F2的256MB软限制)。在

def get(self):
    # Work with GAE's 32MB-per-request limit, set to 30MB to stay under
    RANGE = 30*(1024**2)

    url = self.request.get('url')
    request = urllib2.Request(url)

    request.get_method = lambda: 'HEAD'
    response = urllib2.urlopen(request)
    info = response.info()
    logging.debug('Downloading {}B video'.format(info.get('Content-length')))

    request.get_method = lambda: 'GET'
    _buffer = ''
    start = 0
    while True:
        end = start + RANGE
        request.headers['Range'] = 'bytes={}-{}'.format(start, end)
        logging.debug('Buffering bytes {} to {}'.format(start, end))
        _bytes = urllib2.urlopen(request, timeout=60).read()
        _buffer += _bytes
        logging.info('Buffered bytes {} to {}'.format(start, end))

        # If there are less bytes than requested then all bytes
        # have been received, break to avoid an HTTP 416
        if len(_bytes) < (end - start):
            break

        start += (RANGE + 1)

    filename = '/MY-BUCKET/video/test_large.mp4'
    with gcs.open(filename, 'w', content_type='video/mp4') as f:
        f.write(_buffer)
    logging.info('Wrote {}B video to GCS'.format(len(_buffer)))

在日志中是这样的:

^{pr2}$

更新,2015年5月6日

按照Kekito的建议,我将GCS write移到循环中,在整个过程中保持文件句柄打开。在

^{3}$

按照here的建议,我使用top监视运行GAE local dev服务器的Python进程,启动上载,并记录下载和上载周期之间的内存占用。在

我还尝试改变一次处理块的大小:将块大小从30MB降低到20MB,最大内存使用量减少了~50MB。在下图中,有一个560 MB的文件正在被摄取,我正在尝试跟踪:

  1. GC:内存使用率最低,而urlopen()G设置C大块数据的
  2. WC:内存使用的峰值,而f.write()WC写入GCS

enter image description here

20MB块测试的最大值为230MB,而30MB的块测试最大值为281MB。所以,我可以用256MB的速度运行一个实例,但在512MB下运行可能会感觉更好。我也可以试试更小的块大小。在

相关问题 更多 >

    热门问题