我想在App Engine NDB中存储> 1MB的文本,但是NDB对实体大小有1MB的限制。我怎么能存储1 MB的unicode文本?
答案 0 :(得分:1)
我这样做了很多。最初,我将文本文件存储在Google云端存储中,并将文件的地址存储在我的实体中。但是,我停止这样做,因为我发现Google云端存储的API太不可靠了。我存储/检索文件的请求中有很大一部分会超时并在重试时继续超时(我的文件不是很大,大多数都不到1MB)。
为了找到更好的解决方案,我转而使用NDB压缩属性。我的文本文件是可压缩的,所以我的所有文件都应该在压缩时低于1MB的限制。为了更容易,我创建了一个自定义属性(见下文)。
我的自定义属性取决于压缩的ndb.BlobProperty
,我只是将编码和解码添加到UTF8。在某些时候,当输入文本超过大小阈值时,我将进一步扩展此项以将文本存储在Google云端存储中。
如果您希望压缩文本低于1MB限制,那么这对您来说是一个很好的解决方案。否则,您应该使用GCS Python Client,但要注意超时错误。
class UTF8BlobProperty(ndb.BlobProperty):
"""
This is a custom blob property for storing unicode text as utf-8.
Later, we can add storing to GCS if text is too large.
"""
def __init__(self):
super(UTF8BlobProperty, self).__init__(default="", compressed=True)
def _validate(self, text):
if not isinstance(text, basestring):
raise TypeError("Expected a basestring, got %s" % text)
def _to_base_type(self, text):
return text.encode("utf-8")
def _from_base_type(self, text):
return text.decode("utf-8")