Space Efficient Django模型类型用于存储大量文本

时间:2016-02-02 09:30:45

标签: django google-app-engine djangoappengine

目前我正在尝试使用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},...

1 个答案:

答案 0 :(得分:1)

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

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