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进程,启动上载,并记录下载和上载周期之间的内存占用。在
按照保罗·柯林伍德的建议,我想出了以下办法。在
我决定不写块到GCS然后把它们缝合在一起。相反,我选择在内存中执行这些操作,但我可能会根据资源成本(必须运行F4@512MB以避免超过F2的256MB软限制)。在
在日志中是这样的:
^{pr2}$更新,2015年5月6日
按照Kekito的建议,我将GCS write移到循环中,在整个过程中保持文件句柄打开。在
^{3}$按照here的建议,我使用
top
监视运行GAE local dev服务器的Python进程,启动上载,并记录下载和上载周期之间的内存占用。在我还尝试改变一次处理块的大小:将块大小从30MB降低到20MB,最大内存使用量减少了~50MB。在下图中,有一个560 MB的文件正在被摄取,我正在尝试跟踪:
urlopen()
是G设置C大块数据的f.write()
是W将C写入GCS20MB块测试的最大值为230MB,而30MB的块测试最大值为281MB。所以,我可以用256MB的速度运行一个实例,但在512MB下运行可能会感觉更好。我也可以试试更小的块大小。在
相关问题 更多 >
编程相关推荐