GAE - 将优化后的图像上传到云存储
GAE - Upload optimized image to cloud storage
我正在开发一个简单的应用程序,可以对图像进行优化并将它们保存在云存储中。我找到了一个使用文件并使用 PIL 对其进行优化的示例。代码如下所示:
def inPlaceOptimizeImage(photo_blob):
blob_key = photo_blob.key()
new_blob_key = None
img = Image.open(photo_blob.open())
output = StringIO.StringIO()
img.save(output,img.format, optimized=True,quality=90)
opt_img = output.getvalue()
output.close()
# Create the file
file_name = files.blobstore.create(mime_type=photo_blob.content_type)
# Open the file and write to it
with files.open(file_name, 'a') as f:
f.write(opt_img)
# Finalize the file. Do this before attempting to read it.
files.finalize(file_name)
# Get the file's blob key
return files.blobstore.get_blob_key(file_name)
这在本地运行良好(尽管我不知道它的优化程度如何,因为当我 运行 通过 http://www.jpegmini.com/ 之类的方式上传图片时,它仍然减少了 2.4 倍)。但是,当我部署应用程序并尝试上传图像时,我经常会收到 500 条错误消息,并且日志中会出现以下消息:
F 00:30:33.322 Exceeded soft private memory limit of 128 MB with 156 MB after servicing 7 requests total
W 00:30:33.322 While handling this request, the process that handled this request was found to be using too much memory and was terminated. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may have a memory leak in your application.
我有两个问题:
- 这是在云存储中优化和保存图像的最佳方式吗?
- 如何防止这 500 个错误的发生?
提前致谢。
您遇到的错误是由于实例的内存限制造成的 class。
我建议您做的是编辑您的 .yaml 文件以配置您的模块,并将您的实例 class 指定为 F2 或更高级别。
如果您不使用模块,您还应该在 app.yaml 文件的开头添加“module: default”,让 GAE 知道这是您的默认模块。
您可以从文档中查看此 article 以查看可用的不同实例 class 以及轻松配置它们的方法。
另一个更基本的解决方法是在上传图像时限制图像大小,但您最终会遇到类似的问题。
关于前面的事情和优化图像的方法,您可能想看看 App Engine Images API,它提供了使用专用图像服务处理图像数据的能力。在您的情况下,您可能喜欢 "I'm Feeling Lucky" 转换。通过使用这个 API 你可能不需要更新你的实例 class.
我正在开发一个简单的应用程序,可以对图像进行优化并将它们保存在云存储中。我找到了一个使用文件并使用 PIL 对其进行优化的示例。代码如下所示:
def inPlaceOptimizeImage(photo_blob):
blob_key = photo_blob.key()
new_blob_key = None
img = Image.open(photo_blob.open())
output = StringIO.StringIO()
img.save(output,img.format, optimized=True,quality=90)
opt_img = output.getvalue()
output.close()
# Create the file
file_name = files.blobstore.create(mime_type=photo_blob.content_type)
# Open the file and write to it
with files.open(file_name, 'a') as f:
f.write(opt_img)
# Finalize the file. Do this before attempting to read it.
files.finalize(file_name)
# Get the file's blob key
return files.blobstore.get_blob_key(file_name)
这在本地运行良好(尽管我不知道它的优化程度如何,因为当我 运行 通过 http://www.jpegmini.com/ 之类的方式上传图片时,它仍然减少了 2.4 倍)。但是,当我部署应用程序并尝试上传图像时,我经常会收到 500 条错误消息,并且日志中会出现以下消息:
F 00:30:33.322 Exceeded soft private memory limit of 128 MB with 156 MB after servicing 7 requests total
W 00:30:33.322 While handling this request, the process that handled this request was found to be using too much memory and was terminated. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may have a memory leak in your application.
我有两个问题:
- 这是在云存储中优化和保存图像的最佳方式吗?
- 如何防止这 500 个错误的发生?
提前致谢。
您遇到的错误是由于实例的内存限制造成的 class。
我建议您做的是编辑您的 .yaml 文件以配置您的模块,并将您的实例 class 指定为 F2 或更高级别。 如果您不使用模块,您还应该在 app.yaml 文件的开头添加“module: default”,让 GAE 知道这是您的默认模块。
您可以从文档中查看此 article 以查看可用的不同实例 class 以及轻松配置它们的方法。
另一个更基本的解决方法是在上传图像时限制图像大小,但您最终会遇到类似的问题。
关于前面的事情和优化图像的方法,您可能想看看 App Engine Images API,它提供了使用专用图像服务处理图像数据的能力。在您的情况下,您可能喜欢 "I'm Feeling Lucky" 转换。通过使用这个 API 你可能不需要更新你的实例 class.