如何删除/计算 s3 存储桶中的对象?
Posted
技术标签:
【中文标题】如何删除/计算 s3 存储桶中的对象?【英文标题】:How do I delete/count objects in a s3 bucket? 【发布时间】:2010-10-16 15:18:07 【问题描述】:所以我知道这是一个常见问题,但似乎没有任何好的答案。
我有一个带有 gobs(我不知道有多少)文件的存储桶。它们都在 2k 以内。
1) 我如何确定我有多少这些文件没有列出? 我用过 s3cmd.rb、aws/s3 和 jets3t 的东西,我能找到的最好的方法是计算前 1000 条记录的命令(真正对它们执行GETS)。
我也一直在使用 jets3t 的小程序,因为它非常好用,但即使我无法列出所有对象,因为堆空间已用完。 (大概是因为它正在对所有这些执行GETS并将它们保存在内存中)
2) 我怎样才能删除一个存储桶? 我见过的最好的事情是并行删除循环,它有问题,有时它会尝试删除同一个文件。这就是我遇到的所有“删除所有”命令的作用。
那些吹嘘自己拥有数百万张图片/txt 的人在做什么?当你想删除它时会发生什么?
3) 最后,还有其他答案吗?所有这些文件都是 txt/xml 文件,所以我什至不确定 S3 是否值得关注——也许我应该把它移到各种文档数据库中??
归结为亚马逊 S3 API 直接缺少 2 个非常重要的操作 - COUNT 和 DEL_BUCKET。 (实际上有一个删除桶的命令,但它只在桶为空时才有效)如果有人想出一个不糟糕的方法来做这两个操作,我很乐意放弃很多赏金。
更新
只是回答几个问题。我问这个的原因是我在过去一年左右一直在存储数十万,更像是数百万个 2k txt 和 xml 文档。上一次,几个月前,我希望删除它确实需要 DAYS 天才能删除的存储桶,因为存储桶必须是空的,然后才能删除它。在没有 API 支持的情况下,我担心再次这样做是一件非常痛苦的事情。
更新
这房子太震撼了!
http://github.com/SFEley/s3nuke/
我在几分钟内完成了几场演出,价值 1-2k 的文件。
【问题讨论】:
【参考方案1】:计数
aws s3 ls s3://mybucket/ --recursive | wc -l
From this post
删除
aws s3 rm --recursive s3://mybucket/ && aws s3 rb s3://mybucket/
这会删除每个项目,然后是存储桶。
【讨论】:
【参考方案2】:统计 S3 存储桶中的对象:
转到 AWS 账单,然后是报告,然后是 AWS 使用情况报告。 选择 Amazon Simple Storage Service,然后选择 Operation StandardStorage。 下载一个包含 StorageObjectCount 的 UsageType 的 CSV 文件,该文件列出了每个存储桶的项目计数。
【讨论】:
第二种计算方式在哪里?【参考方案3】:旧线程,但仍然相关,因为我一直在寻找答案,直到我弄清楚这一点。我想要使用基于 GUI 的工具(即没有代码)的文件计数。我碰巧已经使用了一个名为 3Hub 的工具来进行与 S3 之间的拖放传输。我想知道我有多少文件在一个特定的存储桶中(我不认为计费会按存储桶划分)。
So, using 3Hub,
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac)
- look at the line count
我的存储桶中有 20521 个文件,不到一分钟就完成了文件计数。
我想知道是否有人找到了更好的方法,因为这需要花费一些时间来处理数十万个文件。
【讨论】:
【参考方案4】:“列表”不会检索数据。我使用 s3cmd(一个 python 脚本),我会做这样的事情:
s3cmd ls s3://foo | awk 'print $4' | split -a 5 -l 10000 bucketfiles_
for i in bucketfiles_*; do xargs -n 1 s3cmd rm < $i & done
但首先要检查你得到了多少个 bucketfiles_ 文件。每个文件将运行一个 s3cmd。
这需要一段时间,但不是几天。
【讨论】:
这个方法我真的试过了——我刚刚得出的结论是S3现在不支持删除bucket,而且它可怕的访问速度让我对S3感到非常苦涩. s3cmd 删除s3cmd ls s3://Mybigbucket/somepattern | awk 'print $4'
。是的,这很痛苦【参考方案5】:
我在从存储桶中删除数十万个文件时遇到了同样的问题。启动 EC2 实例以运行并行删除可能是值得的,因为 S3 的延迟很低。我认为托管一堆 EC2 服务器并向人们收取快速删除存储桶的费用是可以赚到钱的。 (至少在亚马逊开始改变 API 之前)
【讨论】:
【参考方案6】:1)关于您的第一个问题,您可以列出存储桶中的项目,而无需实际检索它们。您可以使用SOAP 和REST API 来做到这一点。如您所见,您可以定义要列出的最大项目数以及开始列出的位置(标记)。阅读更多关于它的信息here。
我不知道分页的任何实现,但特别是对于 REST 接口,用任何语言实现它都非常容易。
2) 我认为删除存储桶的唯一方法是首先将其从所有项目中清空。参见question。
3) 我想说 S3 非常适合存储大量文件。然而,这取决于你想做什么。您是否还打算存储二进制文件?您需要执行任何查询还是仅列出文件就足够了?
【讨论】:
甚至列出了 1000 次或任何数字的键——这花了很长时间——超过一个下午,在我感到无聊并注意到我的堆太满后,我终于把它杀了。 我认为没有 API 调用来获取项目数。可能您使用的工具也可以获取文件的内容——这就是它花了这么长时间的原因。只需使用 Fiddler 或其他工具发送 GET 存储桶请求(请参阅我的答案中的 REST API 链接)。取回 xml 应该不会花很长时间。恐怕我自己没有这么大的桶来测试。【参考方案7】:我绝对不是那些“吹嘘拥有数百万张图片/txt”的人之一,因为我只有几千张,这可能不是您要寻找的答案,但我查看了不久前。
据我记得,有一个名为 HEAD 的 API 命令获取有关对象的信息,而不是像 GET 那样检索完整的对象,这可能有助于对对象进行计数。
关于删除Bucket,我当时看的时候,API明确说bucket必须是空的,所以你需要先删除所有的对象。
但是,我从来没有使用过这两个命令,因为我使用 S3 作为备份,最后我写了一些例程将我想要的文件上传到 S3(所以这部分是自动化的),但从来没有打扰过等式的恢复/删除/文件管理方面。为此,使用 Bucket Explorer 完成了我所需要的一切。就我而言,花 50 美元就可以得到一个满足我所有需要的程序,这不值得花时间。可能还有其他人也这样做(例如 CloudBerry)
在您的情况下,使用 Bucket Explorer,您可以右键单击存储桶并选择删除或右键单击并选择属性,它将计算对象的数量和它们占用的大小。它当然不会下载整个对象。 (例如,我查看的最后一个存储桶是 12Gb 和大约 500 个文件,下载 12GB 需要几个小时,而大小和计数在一两秒内返回)。如果有限制,那肯定不是 1000。
希望这会有所帮助。
【讨论】:
以上是关于如何删除/计算 s3 存储桶中的对象?的主要内容,如果未能解决你的问题,请参考以下文章