Space 用于存储大量文本的高效 Django 模型类型

Space Efficient Django model type to store large amount of text

目前我正在尝试使用 djangoappengine 将现有的 Google App Engine 应用程序从 webapp2 移植到 django。

内存中是否有等效的 space 保存方法来使用 Django 存储数据?因为免费用户在GAE中存储的数量是有限制的。

webapp2 模型代码

class TagTrend_refine(ndb.Model):
    tag = ndb.StringProperty()
    trendData = ndb.BlobProperty(compressed=True)

我知道 TextField 可以存储大量文本,但它可以使用较小的内存存储吗?可以使用 BlobField 吗?

趋势数据(多达 24783 个字符)存储的数据示例是

{"2008": "{\"nodes\": [{\"group\": 0, \"name\": \"ef-code-first\", \"degree\": 6}, {\"group\": 1, \"name\": \"gridview\", \"degree\": 6}, {\"group\": 2, \"name\": \"mvvm\", \"degree\": 6}, {\"group\": 1, \"name\": \"webforms\", \"degree\": 6}, {\"group\": 2, \"name\": \"binding\", \"degree\": 6}, {\"group\": 3, \"name\": \"web-services\", \"degree\": 6}, {\"group\": 2, \"name\": \"datagrid\", \"degree\": 6},...

Django 本身并没有存储压缩数据的方法,但是您可以使用 zlib 模块在将数据保存到数据库之前对其进行压缩。

下面是 Django 中此类字段的示例实现:

class CompressedTextField(models.TextField):

    def __init__(self, compress_level=6, *args, **kwargs):
        self.compress_level = compress_level
        super(CompressedTextField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        value = super(CompressedTextField, self).to_python(value)
        return zlib.compress(value.encode(), self.compress_level)

    def get_prep_value(self, value):
        value = super(CompressedTextField, self).get_prep_value(value)
        return zlib.decompress(value).decode()

与常规字段相比,此字段有一个额外的参数 TextField:

class TagTrend(models.Model):

    tag = models.CharField(max_length=1024)

    # zlib offers compression levels 0-9
    #    0 is no compression
    #    9 is maximum compression
    trendData = CompressedTextField(compress_level=9)

举个例子,存储字符串'a' * 1024(1024字节)压缩后只有17字节。

请注意,使用此类字段的限制是数据是压缩存储的。这意味着您的数据库查询将 search/filter 使用压缩版本。