App Engine:存储> 1MB文本的最佳方式是什么?

时间:2015-12-30 21:04:24

标签: python google-app-engine google-cloud-datastore nosql

我想在App Engine NDB中存储> 1MB的文本,但是NDB对实体大小有1MB的限制。我怎么能存储1 MB的unicode文本?

1 个答案:

答案 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")