小编Jab*_*key的帖子

写入云端存储时GAE内存泄漏,我可以流式传输吗?

我正在从外部API请求数据,并将其直接写入云存储文件.数据写得很好,但是当我扩展时,我遇到内存问题并且在GAE实例上达到了1024 MB的限制.

这些是我得到的关键错误:

Exceeded soft private memory limit of 1024 MB with 1425 MB after servicing 46 requests total
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码的摘要:

import cloudstorage as gcs
import urllib2

# Example file path
filePath = '/bucket/dir/file.gzip'

def deferrableTask(filePath, api_url, post_body):
  with gcs.open(filePath, 'w') as f:
      request = urllib2.Request(api_url, post_body)
      try:
        response = urllib2.urlopen(request, timeout = 600)
      except urllib2.HTTPError, e:
        raise customError(e)
      else:
        while True:
          chunk = response.read(16 * 1024)
          if not chunk: break
          f.write(chunk)
      f.close()
      del f
  gc.collect()
Run Code Online (Sandbox Code Playgroud)

使用任务队列可以推断上述任务.最多可能有40个并发运行在队列中.在我app.yaml,我有以下设置:

instance_class: F4_1G …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine memory-leaks google-cloud-storage

7
推荐指数
1
解决办法
308
查看次数

延迟任务创建无法访问某些python模块的新实例

我使用最新版本的GAE,具有自动缩放,端点API和deferred.defer()任务.

问题是,自从添加API以来,有些实例会自动启动,总是会导致永久性任务失败:

Permanent failure attempting to execute task
Traceback (most recent call last):
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 310, in post
    self.run_from_request()
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 305, in run_from_request
    run(self.request.body)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 145, in run
    raise PermanentTaskFailure(e)
PermanentTaskFailure: No module named app.Report
Run Code Online (Sandbox Code Playgroud)

永久任务失败对于单个实例是唯一的,其中该实例上的每个延迟任务都会失败.即使任务未使用Api.py模块,这些延迟任务都会抛出相同的错误.在其他情况下,如果未将任何路由到故障实例,则相同的延迟任务将正常运行.

app.yaml处理程序看起来像这样:

handlers:
# Api Handler
- url: /_ah/api/.*
  script: main.api
- url: /_ah/spi/.*
  script: main.api
# All other traffic
- url: .*
  script: main.app

builtins:
- deferred: on
Run Code Online (Sandbox Code Playgroud)

main.py看起来像:

import Api, endpoints, webapp2

api = endpoints.api_server([Api.AppApi])

app = webapp2.WSGIApplication( …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine google-cloud-endpoints

5
推荐指数
1
解决办法
803
查看次数

Google Cloud Storage 分段上传,最后一个块失败 (503)

因此,我尝试使用分段上传将文件上传到 Google Cloud 存储,方法是预先将文件分成块并通过 http put 请求发送。

问题是,当我上传文件的最后一块时,我收到 503 错误,而不是 200 完整消息。

为了简单起见,我使用驱动器中的 jpeg 图像,转换为 blob,然后转换为字节:

var data = DriveApp.getFileById(DriveImageFileId).getBlob().getBytes();
Run Code Online (Sandbox Code Playgroud)

根据文档,我首先请求一个可重复上传 URI。

  var accessToken = OAuth2.0_Access_Token;
  var header = {'X-Upload-Content-Type' : 'image/jpeg'}
  var body = {"name": "filename.jpeg"}  
  var options = {
    'method':'post',
    'contentType':'application/json',
    'oAuthUseToken':'never',  // Disables OAuth1.0 config 
    'muteHttpExceptions':true,
    'headers':header,
    'contentLength': 582381,
    'payload':JSON.stringify(body)
  };

  var response = UrlFetchApp.fetch('https://www.googleapis.com/upload/storage/v1beta2/b/myCloudStoreBucket/o?uploadType=resumable&access_token='+accessToken,options).getHeaders();
  var uploadUrl = response.Location 
Run Code Online (Sandbox Code Playgroud)

这很好用。

我开始将文件字节解析为 256x1024 字节块,并使用上传 URL 通过 http 使用 PUT 进行上传。这不是问题,因为每次我上传一个块时,我都会收到 308 响应,其中包含预期上传的字节数。我可以多次执行此操作,以 256x1024 为单位,上传整个文件直到最后一个块。

这是最后一个块的 UrlFetchApp 选项和标头,例如:

 var …
Run Code Online (Sandbox Code Playgroud)

javascript urlfetch google-apps-script google-cloud-storage

3
推荐指数
1
解决办法
1622
查看次数

NDB模型使用数组过滤器查询密钥ID

我正在尝试使用提供的密钥id字符串列表来查询NDB模型.该模型具有在创建时分配的字符串ID - 例如:

objectKey = MyModel(
    id="123456ABC",
    name="An Object"
    ).put()
Run Code Online (Sandbox Code Playgroud)

现在我无法弄清楚如何使用列表过滤器查询NDB密钥ID.通常,您可以执行MyModel.property.IN()来查询属性:

names = ['An Object', 'Something else', 'etc']

# This query works
query = MyModel.query(MyModel.name.IN(names))
Run Code Online (Sandbox Code Playgroud)

当我尝试按键列表进行过滤时,我无法使其工作:

# This simple get works
object = MyModel.get_by_id("123456ABC")

ids = ["123456ABC", "CBA654321", "etc"]

# These queries DON'T work
query = MyModel.query(MyModel.id.IN(ids))
query = MyModel.query(MyModel.key.id.IN(ids))
query = MyModel.query(MyModel.key.id().IN(ids))
query = MyModel.query(MyModel._properties['id'].IN(ids))
query = MyModel.query(getattr(MyModel, 'id').IN(ids))
...
Run Code Online (Sandbox Code Playgroud)

我总是得到AttributeError: type object 'MyModel' has no attribute 'id'错误.

我需要能够按ID列表进行过滤,而不是遍历列表中的每个ID(有时很长).我该怎么做?

python google-app-engine app-engine-ndb google-cloud-datastore

2
推荐指数
1
解决办法
1364
查看次数