1

DB を使用して、非常に大きな辞書を作成したいと考えています。ディスクに保存すると、ピクルス化すると、約 10 MB のスペースが必要になります。

私がやりたいことは次のとおりです。

この辞書をそのままディスクに保存して、そのテキスト ドキュメントを開いて別の py ファイルにコピーし、毎回再生成する必要がないようにし、py ドキュメントが Web アプリ経由で呼び出されるたびに、それを反復可能です。

これどうやってするの?

PS。私のアプリは Google アプリ エンジンで実行されており、この問題をこのように解決して、DB などのリソースの使用を控えたいと考えています。

4

6 に答える 6

6

ファイルAPIを介してブロブストアに保存します:

class YourDictModel(ndb.Model):
    data = ndb.BlobKeyProperty()

huge_dict = dict(...)

file_name = files.blobstore.create(mime_type='application/octet-stream')
with files.open(file_name, 'a') as f:
    f.write(marshal.dumps(huge_dict))

    # Finalize the file. Do this before attempting to read it.
    files.finalize(file_name)

    # Get the file's blob key
    blob_key = files.blobstore.get_blob_key(file_name)
    entity = YourDictModel(data = blob_key)

    entity.put()

次のことに注意してください。

  • BLOB を変更することはできないため、変更するには、辞書をメモリに読み込み、BLOB を削除し、新しい BLOB を作成して、モデルのキーを置き換える必要があります。
  • ディクショナリが大きいほど、ソフト プロセス サイズ制限に達する可能性が高くなります。
  • 私はマーシャルを使用していますが、ピクル、json、または好きなものを使用できます。

GAE SDK からファイルに書き込むことはできません: Python と Google AppEngine を使用してファイルを作成または作成する方法 (存在しない場合)

于 2012-06-14T20:16:49.607 に答える
1

まず、辞書 pickled が 10MB かかる場合、py ファイルにそのまま保存する場合よりも多くのスペースを使用する可能性があります。辞書に基本型しか含まれていない場合は、単純な印刷のみを使用できます

>>> print 'mydict = %s' %({'a': [1,2], 2: 'c'}, )
mydict = {'a': [1, 2], 2: 'c'}

また、そのようなファイルの読み込み時間はかなりのものになることも考慮してください。

第二に、プロジェクトのソースを動的に変更できないため、Google App Engine を使用してやりたいことを実行することはできません。その辞書が決して変わらない限り。

Google アプリ エンジンには Datastore に対しても無料の割り当てがあるため、それをバイパスしようとする意味がわかりません。

于 2012-06-14T17:59:47.683 に答える
1

Pythonとしてロードできる辞書のダンプが必要なようです。それはかなり簡単です:

>>> d = {'key': 'value'}
>>> print '%r' % (d, )
{'key': 'value'}
>>> print repr(d)
{'key': 'value'}
>>> open('/tmp/mydict.py', 'w').write(repr(d))
于 2012-06-14T21:04:54.433 に答える
0

正直なところ、なぜあなたがこれをやろうとするのか理解できないので、役立つアイデアを思いつくことができません.

やりたいことではなく、やろうとしていることを明確にできますか?

私があなたを正しく理解していれば、あなたがしたいことはリソースの使用を回避することです. プラットフォームを使用している場合、GAE リソースの使用を避ける方法はありません。何をしても、App Engine である種のリソース使用率が発生します。ディクショナリをデータストア、ブロブストア、または memcache に配置します。データを別の URL に送信したり、データをダウンロードおよびアップロードしたりできますが、まだリソースを使用しています。

于 2012-06-14T20:03:47.247 に答える
0

GAE 上のファイルの最大許容サイズは 10,485,760 バイトです。

Python アプリのアップロード、ダウンロード、管理 - Google Developers

また、そのサイズの辞書はあまり効率的ではないようです。アプリの実行に必要なインスタンス時間数で失われる可能性がある、データ ストア呼び出しで節約できるもの。

最終的には、コストとパフォーマンスの観点から、データ ストアのみを使用する方がよいでしょう。

于 2012-06-14T18:09:30.447 に答える
0

App Engine ではディスクに保存できません。最も近いのは、ピクルしてブロブストアに保存することです。

https://developers.google.com/appengine/docs/python/blobstore/

パフォーマンスがそれだけの価値があるかどうかを確認するには、独自のテストを行う必要がありますが、クエリを発行してこのデータを何度も再生成するよりも、Blobstore の方がコストがかからない可能性があります。

于 2012-06-14T18:10:31.933 に答える