获取 GCS 中文件夹的文件数和总大小的最快方法?

Posted

技术标签:

【中文标题】获取 GCS 中文件夹的文件数和总大小的最快方法?【英文标题】:Fastest way to get the files count and total size of a folder in GCS? 【发布时间】:2021-01-01 15:36:28 【问题描述】:

假设有一个带有文件夹根的存储桶,它有子文件夹和文件。有什么方法可以获取根文件夹的总文件数和总大小?

我尝试了什么: 使用gsutil du,我可以快速获得尺寸,但不会计数。使用gsutil ls ___ ,我会得到列表和大小,如果我用 awk 管道并将它们相加。我可能会得到预期的结果,但 ls 本身需要很多时间。

那么有没有更好/更快的方法来处理这个问题?

【问题讨论】:

【参考方案1】:

如果您想长期跟踪存储桶中的对象计数,Cloud Monitoring 提供了metric“storage/object_count”。该指标大约每天更新一次,这使其对长期趋势更有用。

至于即时计数,不幸的是gsutil ls 可能是你最好的选择。

【讨论】:

首先感谢您的评论,但我的用例是即时的,gsutil ls 非常慢。 :( 还有为什么 google 没有正确提供文件夹大小,它显示 --- 作为大小,但在文件夹内它有文件。【参考方案2】:

进行某种对象列表是可行的方法 - gsutil 中的 lsdu 命令都在后台执行对象列表 API 调用。

如果您想获取存储桶中所有个对象的摘要,请查看 Cloud Monitoring (as mentioned in the docs)。但是,如果您想要对象子集的统计信息,这不适用 - GCS 不支持实际的“文件夹”,因此“文件夹”foo 下的所有对象实际上只是以公共前缀命名的对象,@ 987654327@.

如果您想分析给定前缀下的对象数量,您需要执行对象列表 API 调用(使用客户端库或使用 gsutil)。列表操作每个响应只能返回这么多对象,因此是分页的,这意味着如果您在所需前缀下有很多对象,则必须进行多次调用。当前每个列表调用的最大结果数为 1,000。例如,如果要列出 200,000 个对象,则必须进行 200 次连续 API 调用。

关于 gsutil 的ls

在完成ls 命令时,gsutil 可以在多种情况下执行“额外”工作,例如使用-L 标志执行“长”列表或使用-r 标志执行递归列表时。为了节省时间并尽可能少地执行列表以获得某个前缀下的总字节数,您需要使用 gsutil 的通配符支持进行“平面”列表,例如:

gsutil ls -l gs://my-bucket/some-prefix/**

或者,您可以尝试使用 GCS 客户端库之一编写脚本,例如 the Python library 及其 list_blobs 功能。

【讨论】:

以上是关于获取 GCS 中文件夹的文件数和总大小的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章

查找目录中的文件数

如何使用 Python 计算目录中的文件数

使用 Web API 检索块中的文件数据以在浏览器中显示 (WIP)

怎样查看linux进程打开的文件数

如何计算每个目录中的文件数?

python 蟒蛇统计文件夹中的文件数