我正在从外部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) 我使用最新版本的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) 因此,我尝试使用分段上传将文件上传到 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) 我正在尝试使用提供的密钥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