【问题标题】:Space Efficient Django model type to store large amount of text节省空间的 Django 模型类型,用于存储大量文本
【发布时间】:2016-05-11 00:37:42
【问题描述】:

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

在节省内存空间方面是否有等效的方法来使用 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 google-app-engine djangoappengine


    【解决方案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字节。

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

    【讨论】:

    • 嗨,函数 to_python 和 get_prep_value 是否覆盖了基本函数?所以我基本上可以像平常一样保存对象,t = TagTrend(tag='stuff',trendData='fafa')。压缩将由覆盖的函数处理?
    • 当我使用 bulk_create 保存对象列表时,您知道为什么会出现“解压缩数据时出现错误 -3:错误的标头检查”吗?
    • @LeonBrain 是的,to_pythonget_prep_value 函数正在覆盖它们的父版本。您可以正常保存对象,并且会自动进行压缩。我刚刚再次测试了该字段,并且在bulk_create 时没有收到任何错误。您能否发布代码 sn-p 说明您遇到的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多