2

从 Blobstore 中删除孤立 blob 的最有效方法是什么?

应用功能和范围:

  • 一个(登录的)用户想要创建一个包含一些普通数据存储字段(例如姓名、姓氏、评论)和 blob(图像)的帖子。
  • 此外,在通过 POST 发送数据恢复之前,blob 是异步上传的
    • 这给孤儿留下了很好的机会,例如,用户可能会上传图像但由于某种原因没有填写表格。通过在发送其余数据之前不使用 blob 的异步上传可以最小化这个问题,但是,这个问题仍然会在较小的范围内存在。

可能但低效的解决方案:

  • 每当一个帖子完成(即发送其余数据)时,您将 blob 键添加到“已用 blob”表中。然后,您可以每隔一段时间运行一个 cron 并将所有 blob 与“已用 blob”表进行比较。一个多小时前上传但仍“未使用”的将被删除。
    • 我的理解是,遍历可能包含数十万个 blob 键的列表并将其与另一个包含数十万个“已使用 blob 键”的表进行比较是非常低效的。

有没有更好的方法来做到这一点?我搜索了类似的帖子,但找不到任何提及有效的解决方案。

提前致谢!

4

4 回答 4

3

感谢您的评论。但是,我很了解这些解决方案,我发现它们效率太低。查询数千个标记为“未使用”的条目并不理想。

我相信我想出了一个更好的方法,并想听听您对此的想法:

保存 blob 后,会立即创建一个延迟任务以在一小时内删除相同的 blob。如果创建并保存了帖子,则会删除延迟任务,因此不会在一个小时内删除 blob。

我相信这可以使您不必每小时查询数千个条目。

您对此解决方案有何看法?

于 2012-11-06T08:20:47.537 回答
1

一个 blob 也有一个文件名。发布后,您可以删除所有具有相同文件名的旧 blob。要删除的重复项必须具有相同的所有者或没有所有者。您还必须删除没有所有者的 blob。

这是上传后删除重复项的示例。

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

要清理“未使用”的 blob,您可以在每次上传后安排一个任务,在一个小时后运行。

于 2012-11-01T23:08:49.457 回答
1

您可以创建一个将 blob 链接到用户的实体。当用户上传 Blob 时,您会立即使用 Blob ID、用户 ID(或帖子 ID)和创建时间创建新记录。当用户提交帖子时,您向该实体添加一个标志,指示使用了一个 blob。

现在,您的 cron 作业需要获取标志不等于“true”且创建时间超过一小时前的所有此类实体。此外,您只能获取键,这是一种比获取完整实体更有效的操作。

于 2012-11-02T00:06:04.913 回答
0

使用草稿!每次上传后另存为草稿。那就别打扫了!让用户为自己选择一扫而光。

如果您打算发布 Facebook 风格的帖子,请使用草稿或将其设为私有。为什么要删除用户的数据?

于 2013-05-04T20:43:58.370 回答