"cat urls.txt | gsutil -m cp -I gs://target-bucket-name/" 在传输约 10,000 个文件后一直挂起

"cat urls.txt | gsutil -m cp -I gs://target-bucket-name/" consistently hangs after transferring ~10,000 files

我正在尝试将大约 80,000 张图像从一个 google 云存储桶复制到另一个。 我正在从 mac 和 google cloud sdk 180.0.1 启动此操作,其中包含 gsutil 4.28.

要传输到文本文件中的每个图像的 ~url,我像这样将其提供给 gsutil cp ...

$cat urls.txt | gsutil -m cp -I gs://target-bucket-name/

其中 urls.txt 看起来像 ...

head -3 urls.txt 
gs://source-bucket-name/1506567870546.jpg
gs://source-bucket-name/1506567930548.jpg
gs://source-bucket-name/1507853339446.jpg

在传输了约 10,000 张图像后,该过程一直挂起。

我已编辑 $HOME/.boto 以取消注释:

parallel_composite_upload_threshold = 0

这并没有阻止操作挂起。

我不确定是什么原因造成的。

基本需求是通用实用程序将 N 项从一个存储桶复制到另一个存储桶。我需要一个能让我完成那个任务的变通方法。

更新

删除 -m 选项似乎可以解决挂起问题,但文件传输现在明显变慢了。我希望能够避免挂起问题,同时尽可能获得使用并发带来的速度。

  1. gstuil 不应挂起。这是一个错误。您可以记录 gsutl -D 的输出,当它挂起时,在 gsutil github repo 中创建一个问题并附上输出并在此处用 link 评论它吗?您可以使用以下命令记录输出:

    $ cat urls.txt | gsutil -D -m cp -I gs://target-bucket-name/ 2>&1 | tee output
    
  2. 与此同时,您可以尝试通过更改 boto 文件中的这些默认值来减少并行模式 (-m) 使用的线程和进程的数量。

    parallel_process_count = 1    # Default - 12
    parallel_thread_count = 10    # Default - 10
    
  3. 请注意,gsutil 可以选择将存储桶或子目录中的所有文件复制到新存储桶,也可以使用以下命令仅复制目标中已更改或不存在的文件:

    gsutil -m cp gs://source-bucket/ gs://target-bucket
    gsutil -m cp 'gs://source-bucket/dir/**' gs://target-bucket
    gsutil -m rsync -r gs://source-bucket gs://target-bucket