Python AppEngine*是否可以拉入超过32MB的数据?
我正在编写一个需要接收高清视频(至少100MB)的API。我只能通过HTTP XML提要访问视频,因此只有在获得视频的URL后,我才能(使用GET)提取视频。计划是将视频存储在地面军事系统中 但在我可以上传/写入GCS之前,AppEngine中的每个请求限制已达到32MB 有没有办法绕过这两个限制:Python AppEngine*是否可以拉入超过32MB的数据?,python,google-app-engine,google-cloud-storage,Python,Google App Engine,Google Cloud Storage,我正在编写一个需要接收高清视频(至少100MB)的API。我只能通过HTTP XML提要访问视频,因此只有在获得视频的URL后,我才能(使用GET)提取视频。计划是将视频存储在地面军事系统中 但在我可以上传/写入GCS之前,AppEngine中的每个请求限制已达到32MB 有没有办法绕过这两个限制: 需要成为AppEngine可以发起的GET 需要能够将数据输入地面军事系统 我知道AmazonS3,如果我必须离开谷歌云产品,但我不知道它是否可以配置为拉入大数据 谢谢。根据保罗·科林伍德的建议,我
谢谢。根据保罗·科林伍德的建议,我提出了以下建议 我决定不在GCS上写块,然后再把它们缝合在一起。相反,我选择在内存中完成这一切,但我可能会根据资源成本(必须运行F4@512MB以避免超过F2的256MB软限制) 更新,2015年5月6日 按照Kekito的建议,我将GCS写入循环,在整个过程中保持文件句柄打开
url = self.request.get('url')
request = urllib2.Request(url)
request.get_method = lambda: 'HEAD'
response = urllib2.urlopen(request)
info = response.info()
content_length = int(info.get('Content-length'))
logging.debug('Downloading {}B video'.format(content_length))
del(info)
del(response)
del(request)
request = urllib2.Request(url)
start = 0
filename = '/MY-BUCKET/video/test_large.mp4'
f = gcs.open(filename, 'w', content_type='video/mp4')
while True:
end = start + RANGE
request.headers['Range'] = 'bytes={}-{}'.format(start, end)
f.write(urllib2.urlopen(request, timeout=60).read())
if end >= content_length:
break
start = end + 1
f.close()
按照建议,我使用top
来监视运行GAE本地开发服务器的Python进程,开始上传,并记录下载和上传周期之间的内存占用
我还尝试过改变一次处理一个块的大小:将块大小从30 MB降低到20 MB,将最大内存使用量减少了约50 MB。在下图中,一个560 MB的文件正在被接收,我正在尝试跟踪:
urlopen()
是G设置C大块数据f.write()
是W将C大块写入GCS20MB区块测试的最大值为230MB,而30MB区块测试的最大值为281MB。因此,我可以运行一个只有256MB的实例,但运行512MB可能会感觉更好。我也可以尝试更小的块大小。也许做一个部分get,将每个块写入GCS,然后将它们全部缝合在一起?@PaulCollingwood:谢谢你的建议,成功了!:)看到我下面的答案。我很好奇,如果你将每个块立即写入GCS(在while循环中),而不是在最后全部写入,是否可以避免需要更大的实例。这很酷。我想知道你是否能同时做到这一点?一旦获得了HEAD请求的长度,就可以在队列中启动任务,并允许两个任务并行执行。您甚至可以将可恢复上传()与之结合,这样就不需要在最后缝合文件。
DEBUG 2015-05-01 02:02:00,947 video.py:27] Buffering bytes 0 to 31457280
INFO 2015-05-01 02:02:11,625 video.py:30] Buffered bytes 0 to 31457280
DEBUG 2015-05-01 02:02:11,625 video.py:27] Buffering bytes 31457281 to 62914561
INFO 2015-05-01 02:02:22,768 video.py:30] Buffered bytes 31457281 to 62914561
DEBUG 2015-05-01 02:02:22,768 video.py:27] Buffering bytes 62914562 to 94371842
INFO 2015-05-01 02:02:32,920 video.py:30] Buffered bytes 62914562 to 94371842
...
Writing to GCS
...
INFO 2015-05-01 02:02:41,274 video.py:42] Wrote 89635441B video to GCS
url = self.request.get('url')
request = urllib2.Request(url)
request.get_method = lambda: 'HEAD'
response = urllib2.urlopen(request)
info = response.info()
content_length = int(info.get('Content-length'))
logging.debug('Downloading {}B video'.format(content_length))
del(info)
del(response)
del(request)
request = urllib2.Request(url)
start = 0
filename = '/MY-BUCKET/video/test_large.mp4'
f = gcs.open(filename, 'w', content_type='video/mp4')
while True:
end = start + RANGE
request.headers['Range'] = 'bytes={}-{}'.format(start, end)
f.write(urllib2.urlopen(request, timeout=60).read())
if end >= content_length:
break
start = end + 1
f.close()