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 に答える