【问题标题】:How to concatenate a million files in Google Cloud Storage如何在 Google Cloud Storage 中连接一百万个文件
【发布时间】:2017-03-26 03:05:11
【问题描述】:

根据 Google Cloud Storage 的documentation,使用gsutil compose 有一些限制(见下文)。

有没有更有效的方法将大量文件合并到同一个存储桶(约 100 万)中?

如果我理解正确的话,我必须加入 32 人的小组,然后继续这样做并再次加入?

请注意,单个操作中可以组合的组件数量有限制(目前为 32 个)。

给定复合对象的组件总数存在限制(当前为 1024)。这意味着您最多可以附加到每个对象 1023 次。

每个项目的速率限制(当前为 200)限制您每秒可以编写的组件数量。此比率计算附加到复合对象的组件以及复制它们所属的复合对象时复制的组件。

【问题讨论】:

  • 我很好奇 - 您组合一百万个对象的用例是什么?

标签: google-app-engine google-cloud-storage


【解决方案1】:

GCS 不再强制执行组件计数限制。只要新创建的对象 documented here。

串行执行此操作的一种简单方法是通过重复覆盖附加到单个对象。例如:

  1. 将文件上传为对象 {Fi, Fi+1, ... Ftotal}
  2. 组合对象 {F1, F2, ... F31} 以创建组合对象 X
  3. 递归组合对象 {X, Fi+1, Fi+2, ... Fi+30} 覆盖X 带有一个新对象

由于每个项目的组合速率限制也已取消,您也可以并行执行此操作,方法是批量组合到临时对象,然后删除临时对象。

  1. 组合对象 {Fi, Fi+1, ... Fi+31} 以创建组合对象 X(1)i / 32
  2. 递归组合对象 {X(m)j, X(m)j+1, . .. X(m)j+31} 创建复合对象 X(m+1)j / 32
  3. 删除所有临时对象 X(m)j

唯一需要注意的是,componentCount 元数据属性在 2,147,483,647 处饱和,即使对象具有 > 2,147,483,647 个组件。如果您不依赖componentCount 是否准确,那么这应该不是问题,因为componentCount 不会影响撰写是否成功。

【讨论】:

  • 我们的限制还没有解除。 gsutil version: 4.41(2019-07-16 发布)仍然显示限制:Note that there is a limit (currently 32) to the number of components that can be composed in a single operation. 并且仍然出现错误:CommandException: "compose" called with too many component objects. Limit is 32. 我正在尝试在这里编写几 GB。
  • @nfo 这不是迈克的意思。一次 compose 操作只能合并 32 个对象,但之后您可以继续将之前合并的对象与其他对象无限制地合并
  • 要记住的另一个警告:“虽然复合对象可以包含的组件数量没有限制,但对象的 componentCount 元数据属性在 2,147,483,647 处饱和。例如,假设您有一个包含 3,000,000,000 个组件的对象。在这种情况下,该对象的 componentCount 的值为 2,147,483,647。"
  • 谢谢 manesioz@。我更新了答案以解释 32 限制和 componentCount 属性。
  • compose 是否保持命令中提供的对象的顺序?
【解决方案2】:

很遗憾,由于“总计”组件限制为 1024,因此一遍又一遍地组合 32 个组是行不通的。

相反,你必须做的是:

  1. 让我们将 100 万个原始文件的集合命名为 A(约 1,000,000 个对象)。
  2. 对 A 中的每组 32 个对象调用 compose,生成集合 B(约 30,000 个对象)。 B 中的每个对象的组件数为 32。
  3. 对 B 中每组 32 个对象的组调用 compose,生成集合 C(约 1000 个对象)。这些新对象每个将有 32*32 个组件,即 1024 个。这正是限制。你不能再直接编写它们了。
  4. 对 C 的每个元素调用“rewrite”。这会将组件计数重置为 1。
  5. 对 C 中的每组 32 个元素调用 compose,生成集合 D(约 30 个对象)。
  6. 调用 compose 一次以合并所有 D.

大部分工作可以并行完成,这将大大加快速度。

【讨论】:

  • 也许你应该提到在同一位置或存储类中“重写”不会重置组件计数。不幸的是,对于本应相当简单的操作,需要一种非常老套的方法。
猜你喜欢
  • 2019-07-11
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多