1

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

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

webapp2 模型代码

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

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

为 TrendData 存储的数据示例(多达 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},...
4

1 回答 1

4

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 个字节。

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

于 2016-02-03T06:04:44.627 回答