【问题标题】:App Engine: What is the best way to store >1MB of text?App Engine:存储大于 1MB 的文本的最佳方式是什么?
【发布时间】:2015-12-30 21:04:23
【问题描述】:

我想在 App Engine NDB 中存储 >1MB 的文本,但 NDB 的实体大小限制为 1MB。我还能如何存储 1 MB 的 unicode 文本?

【问题讨论】:

  • 很难说什么是最好的,没有任何关于您的预期用途的详细信息,而是将大 blob 存储在 Cloud Storage(或者可能是 Cloud SQL)中,并且只有一个 URL 或 ID数据存储区,当然是一个很好的可能性。
  • 正如@AlexMartelli 所建议的那样,但在数据存储中存储了额外的元数据,因此您可以使用数据存储来查询、过滤、浏览条目(也许带有文本的摘录?)。如果您已经有一些东西并且不想摆弄 GCS 权限,您也可以使用数据存储条目进行访问控制。如果您想为您的用户提供某种文本搜索功能,您可以使用 Search API 文档(可选或附加)。

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


【解决方案1】:

我经常这样做。最初,我将文本文件存储在 Google Cloud Storage 中,并将文件的地址存储在我的实体中。但是,我停止了这样做,因为我发现 Google Cloud Storage 的 API 太不可靠了。我存储/检索文件的请求中有很大一部分会超时并在重试时继续超时(而且我的文件不是那么大,大多数都在 1MB 以下)。

为了找到更好的解决方案,我转而使用 NDB 压缩属性。我的文本文件是非常可压缩的,所以我的所有文件在压缩时都应该在 1MB 的限制之下。为了方便起见,我创建了一个自定义属性(见下文)。

我的自定义属性依赖于压缩的ndb.BlobProperty,我只是将编码和解码添加到 UTF8。在某个时候,我会进一步扩展它以在输入文本超过大小阈值时将文本存储在 Google Cloud Storage 中。

如果您希望压缩文本小于 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")

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多