【问题标题】:Quickly finding the size of an S3 'folder'快速查找 S3“文件夹”的大小
【发布时间】:2015-07-09 06:06:30
【问题描述】:

我们有数百万个文件的 s3“文件夹”(桶下有前缀的对象),我们想弄清楚这些文件夹的大小。

编写我自己的 .net 应用程序来获取 s3 对象的列表很容易,但每个请求的最大键数是 1000,因此需要很长时间。

使用 S3Browser 查看“文件夹”属性也需要很长时间。我猜也是出于同样的原因。

我已经让这个 .NET 应用程序运行了一周 - 我需要一个更好的解决方案。

有更快的方法吗?

【问题讨论】:

  • 每个请求的最大密钥是 1000?我对技术不是很熟悉,这些文件夹是远程的吗?
  • 是的。 aws.amazon.com/s3
  • 您需要精确计数还是近似计数?对象名称中是否有任何结构可以让您,例如,找出在日期 A 和日期 B 之间添加了多少文件,然后在整个生命周期中进行推断?
  • 近似值会起作用,但它仍然必须相当准确。不过,放入这些位置的对象数量及其大小会随着时间而变化。我们有两年的物品。随着时间的推移,我必须获得多个样本并使用它。

标签: amazon-web-services amazon-s3 aws-sdk


【解决方案1】:

好像 AWS 添加了一个菜单项,可以看到大小:

【讨论】:

    【解决方案2】:

    AWS CLI's ls command 可以这样做:aws s3 ls --summarize --human-readable --recursive s3://$BUCKETNAME/$PREFIX --region $REGION

    【讨论】:

      【解决方案3】:

      我认为理想的解决方案并不存在。但我提供了一些可以进一步发展的想法:

      1. 应用程序是写入 S3 文件的唯一方法吗?如果是这样,您可以存储(在数据库、文件或其他任何地方)文件大小并在必要时求和
      2. 并发调用 LIST api
      3. 能否从基于文件夹的组织切换到基于存储桶的组织?如果是这样,您可以查询计费 API(是的,计费)并根据成本计算大小(或近似值)...

      【讨论】:

      • #1 不适用。不幸的是,我们那里的内容太多,并且已经达到使用 #3 的存储桶限制 #2 是我一直在考虑的选项,但它仍然需要尽可能长的最大“文件夹”,就像 3- 4 小时。
      • on #2:我正在考虑并发调用单个文件夹。通过使用 prefix 参数,您可以拥有 - 例如 - 一个调用列表对象,其名称以“a”开头,一个以“b”开头,等等...
      【解决方案4】:

      如果他们为每个请求限制了 1000 个密钥,我不确定 PowerShell 将如何提供帮助,但如果你想调整一堆文件夹的大小,应该这样做。

      将以下内容保存在名为 Get-FolderSize.ps1 的文件中:

      param
      (
          [Parameter(Position=0, ValueFromPipeline=$True, Mandatory=$True)]
          [ValidateNotNullOrEmpty()]
          [System.String]
          $Path
      )
      
      function Get-FolderSize ($_ = (get-item .))  {
        Process {
          $ErrorActionPreference = "SilentlyContinue"
          #? { $_.FullName -notmatch "\\email\\?" }  <-- Exlcude folders.
          $length = (Get-ChildItem $_.fullname -recurse | Measure-Object -property length -sum).sum
          $obj = New-Object PSObject
          $obj | Add-Member NoteProperty Folder ($_.FullName)
          $obj | Add-Member NoteProperty Length ($length)
           Write-Output $obj
        }
      }
      
      Function Class-Size($size)
      {
      
          IF($size -ge 1GB)
          {
              "{0:n2}" -f  ($size / 1GB) + " GB"
          }
          ELSEIF($size -ge 1MB)
          {
              "{0:n2}" -f  ($size / 1MB) + " MB"
          }
          ELSE
          {
              "{0:n2}" -f  ($size / 1KB) + " KB"
          }
      }
      
      Get-ChildItem $Path | Get-FolderSize | Sort-Object -Property Length -Descending | Select-Object -Property Folder, Length | Format-Table -Property Folder, @{ Label="Size of Folder" ; Expression = {Class-Size($_.Length)} }
      

      用法:.\Get-FolderSize.ps1 -Path \path\to\your\folders

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-20
        • 2018-10-10
        • 2017-12-22
        • 1970-01-01
        • 2010-12-31
        • 2023-03-12
        • 1970-01-01
        • 2021-07-09
        相关资源
        最近更新 更多