2011-01-31 21 views
1

データストアに値を設定したいとします。これを行う最善の方法は何ですか? これは私のコードです -Google App Engineにデータストアエントリを設定する

for n in range(seqlen): 
    for m in range(n+1): 
    for l in range(m+1): 
     temp = [-BIGINT for k in range(m-l+1)] 
     obj = DbEntity4D(key_name=str(n)+','+str(m) +','+ str(l)) 
     obj.value = temp 
     obj.put() 

またはこれは1良いですか?

for n in range(seqlen): 
    for m in range(n+1): 
    for l in range(m+1): 
     temp = [-BIGINT for k in range(m-l+1)] 
     obj[i] = DbEntity4D(key_name=str(n)+','+str(m) +','+ str(l)) 
     obj[i].value = temp 
     i = i+1 

    db.put(obj) 

他にも良い方法がありますか?

seqlenは1〜1000にすることができます。このプロセス全体を10分で終了することはできませんが、前回の作業の中で次の作業に進むことができます。

答えて

2

データストアのバッチ処理は、データストアへのラウンドトリップを排除することにより、かなりの時間を節約します。

これは、コードの後半ブロックでこれを実行しようとしているようです(mエンティティを一度に保存する)。 seqlenが1000の場合、一度に1000個までのエンティティを書きます。しかし、あなたの一番内側のforループは生成するエンティティの数が異なるため、一度に書き込まれるエンティティ数は異なります。 DbEntity4Dエンティティn(いくつかの大きい番号)を収集してから保存するまで、データベースに保存するのを待ってから保存する方が速いかもしれません(最も内側のループの直後に保存するのではなく)。もちろん、これは、次のタスクが前のタスクが中断したこれらのエンティティの作成を再開することを可能にするロジックを複雑にする可能性がある。

+3

が合意されました。私はまた、リモートエンジンの外で実行されているremote_apiスクリプトは、あなたが望む限り実行することができるので、単一の要求やタスクでこれをやろうとするのではなく、remote_apiを使うことをお勧めします。 – ryan

関連する問題