我正在使用Google Cloud Storage package for Python将一堆文件从一个存储桶复制到另一个存储桶。基本代码是:
from google.cloud.storage.client import Client
def copy_bucket_content (client:Client, source_bucket_name, destination_bucket_name, source_dir):
source_bucket = client.get_bucket(source_bucket_name)
destination_bucket = client.get_bucket(destination_bucket_name)
blobs_to_copy = [blob for blob in source_bucket.list_blobs() if blob.name.startswith(source_dir)]
source_bucket.
for blob in blobs_to_copy:
print ("copying {blob}".format(blob=blob.name))
source_bucket.copy_blob(blob, destination_bucket, blob.name)
当我传递其中包含许多blob的source_dir
时,脚本将在运行时失败,并显示以下内容:
第293行,位于api_request中的“ /Users/jamiet/.virtualenvs/hive-data-copy-biEl4iRK/lib/python3.6/site-packages/google/cloud/_http.py”文件
引发异常。from_http_response(response)
google.api_core.exceptions.InternalServerError:500 POST https://www.googleapis.com/storage/v1/b/path/to/blob/copyTo/b/path/to/blob:后端错误
这总是发生在传输50到80个Blob之后(每次都不会在同一点失败)。
我假设我正在达到某种API请求限制。是这样吗?
如果是这样,我该如何解决?我想解除限制是一种方法,但更好的方法是只发出一个对REST API的调用,而不是遍历所有blob并一次复制一个。我搜索了GCS python软件包,但没有找到任何可能有用的东西。
我认为有一种更好的方法可以完成此任务,但是我不知道这是什么,有人可以帮忙吗?
答案 0 :(得分:1)
关于这种情况,没有quota restriction。错误500指示服务器端问题。根据{{3}}文档,您可以使用exponential backoff策略,并遵循Handling errors的最佳做法。