Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AppEngine*是否可以拉入超过32MB的数据?_Python_Google App Engine_Google Cloud Storage - Fatal编程技术网

Python 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,如果我必须离开谷歌云产品,但我不知道它是否可以配置为拉入大数据 谢谢。根据保罗·科林伍德的建议,我

我正在编写一个需要接收高清视频(至少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的文件正在被接收,我正在尝试跟踪:

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

  • 20MB区块测试的最大值为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()