2

ブロブストアから孤立ブロブを削除する最も効率的な方法は何ですか?

アプリの機能と範囲:

  • (ログインしている) ユーザーが、いくつかの通常のデータストア フィールド (名前、姓、コメントなど) とブロブ (画像) を含む投稿を作成したいと考えています。
  • さらに、データの復元が POST 経由で送信される前に、BLOB が非同期的にアップロードされます。
    • これにより、たとえば、ユーザーが画像をアップロードしても、何らかの理由でフォームを完成させない可能性があるため、孤児が発生する可能性が高くなります。この問題は、残りのデータを送信する前に BLOB の非同期アップロードを使用しないことで最小限に抑えられますが、この問題は小規模では依然として存在します。

可能ではあるが非効率的な解決策:

  • 投稿が完了する (つまり、残りのデータが送信される) たびに、BLOB キーを「使用済み BLOB」のテーブルに追加します。次に、cron を頻繁に実行し、すべてのブロブを「使用済みブロブ」の表と比較できます。1 時間以上前にアップロードされたものの、まだ「使用されていない」ものは削除されます。
    • 私の理解では、潜在的に数十万の blob キーのリストを実行し、それを数十万の「使用済み blob キー」の別のテーブルと比較することは非常に非効率的です。

これを行うより良い方法はありますか?同様の投稿を検索しましたが、効率的な解決策について言及しているものは見つかりませんでした。

前もって感謝します!

4

4 に答える 4

3

コメントありがとうございます。しかし、私はそれらの解決策をよく理解していましたが、あまりにも非効率的だと思います。「未使用」としてフラグが立てられたものについて何千ものエントリを照会することは理想的ではありません。

私はより良い方法を思いついたと信じており、それについてのあなたの考えを聞きたいです:

BLOB が保存されると、遅延タスクがすぐに作成され、同じ BLOB が 1 時間以内に削除されます。投稿が作成されて保存されると、延期されたタスクが削除されるため、BLOB は 1 時間以内に削除されません。

これにより、1 時間ごとに何千ものエントリをクエリする必要がなくなると思います。

この解決策についてどう思いますか?

于 2012-11-06T08:20:47.537 に答える
1

ブロブにはファイル名もあります。投稿後、同じファイル名の古いブロブをすべて削除できます。削除する重複は、同じ所有者を持つか、所有者を持たない必要があります。所有者を持たないブロブも削除する必要があります。

アップロード後に重複を削除する例を次に示します。

blobs = blobstore.BlobInfo.gql("WHERE filename = '%s'" %(filename))
for blob in blobs :
    if blob.key() != userdata.blob_ref.key()  : blob.delete()

"使用されていない" BLOB をクリーンアップするには、アップロードのたびにタスクをスケジュールして、1 時間後に実行することができます。

于 2012-11-01T23:08:49.457 に答える
1

BLOB をユーザーにリンクするエンティティを作成できます。ユーザーが BLOB をアップロードすると、すぐに BLOB ID、ユーザー ID (または投稿 ID)、作成時刻を含む新しいレコードが作成されます。ユーザーが投稿を送信すると、このエンティティにフラグを追加して、BLOB が使用されていることを示します。

ここで、cron ジョブは、フラグが「true」に等しくなく、作成時間が 1 時間以上前である、この種のすべてのエンティティをフェッチする必要があります。さらに、キーのみを取得できます。これは、完全なエンティティを取得するより効率的な操作です。

于 2012-11-02T00:06:04.913 に答える
0

下書きを使おう!アップロードするたびに下書きとして保存します。じゃあ掃除しないと!ユーザー自身がワイプアウトを選択できるようにします。

Facebook スタイルの投稿を計画している場合は、下書きを使用するか、非公開にします。なぜわざわざユーザーのデータを削除するのですか?

于 2013-05-04T20:43:58.370 に答える