优化文件夹子集的 gsutil 下载

Posted

技术标签:

【中文标题】优化文件夹子集的 gsutil 下载【英文标题】:Optimizing gsutil download for folder subset 【发布时间】:2020-03-14 11:19:03 【问题描述】:

我有一组文件存储在 Google Cloud 存储桶中 - 100k 个文件,总计 1 TB。我需要一种方法来有效地从存储桶中下载不同的文件子集。

有一种方法可以将所需文件的列表传递给gsutilpython generate_filenames.py | gsutil -m cp -I .,但对于我的场景来说它非常慢(大约 2 MB/秒)。

另外,我注意到如果使用通配符模式 - gsutil -m cp gs://bucketname/folderpath/* . - 下载速度大约是 10 倍。我可以下载所有文件,然后删除不需要的文件,但如果文件集很小,它仍然效率低下。

有什么方法可以利用gsutil 只下载指定的文件列表,但速度仍然高于 2 MB/秒?

【问题讨论】:

【参考方案1】:

尝试随机化输入列表中文件的顺序。 GCS 将文件存储在按对象键分布的分片上,因此词法相似的文件很可能存储在同一个分片上。如果您尝试从单个分片中提取大量小文件,则可能会导致性能下降。根据文件的命名约定,您可能会受限于使用此策略可以实现的目标。请参阅using a naming convention that distributes load evenly across key ranges 上的文档。

除此之外,还有许多可能影响性能的变量:您的互联网连接、您的 GCS 存储类、您的机器等。Google Cloud 提供了一个名为 perfdiag 的工具,可以帮助诊断此类问题.

【讨论】:

感谢您的建议!不幸的是,将传递给gsutil -m cp -I 的文件名的顺序随机化并没有提高我的速度(尽管它确实为打开的文件名符号引入了随机性)。您可能知道为什么使用通配符进行下载比逐个传递文件名要快得多吗? 我希望gsutil 聪明并随机化通配符扩展。但我不知道。

以上是关于优化文件夹子集的 gsutil 下载的主要内容,如果未能解决你的问题,请参考以下文章

Gsutil 在下载具有大量进程的多个文件时使用大量内存

使用 Gsutil 从 Google Cloud 下载文件夹

使用 gsutil 下载 FireStorage 文件

使用 gsutil 从 CSV 下载所有行

gsutil - 如何从谷歌私有云复制/下载所有文件?

为啥 gsutil rsync 会重新下载我们所有的文件?