1

我有一个 Python Azure Functions 计时器触发器,它每天运行一次,并将文件从通用 v2 热存储容器存档到通用 v2 冷存储容器。我正在使用 Linux 消费计划。代码如下所示:

container = ContainerClient.from_connection_string(conn_str=hot_conn_str, 
                                                   container_name=hot_container_name)
blob_list = container.list_blobs(name_starts_with = hot_data_dir)
files = []
for blob in blob_list:
    files.append(blob.name) 
for file in files:
    blob_from = BlobClient.from_connection_string(conn_str=hot_conn_str, 
                                             container_name=hot_container_name, 
                                             blob_name=file)
    data = blob_from.download_blob()
    blob_to = BlobClient.from_connection_string(conn_str=cold_conn_str, 
                                             container_name=cold_container_name, 
                                             blob_name=f'archive/{file}')
    try:                                         
        blob_to.upload_blob(data.readall())
    except ResourceExistsError:
        logging.debug(f'file already exists: {file}')
    except ResourceNotFoundError:
        logging.debug(f'file does not exist: {file}')
    container.delete_blob(blob=file)

在过去的几个月里,这一直对我有用,没有任何问题,但是在过去的两天里,我在存档过程的中途看到了这个错误:
The operation has timed out.
除此之外没有其他有意义的错误消息。如果我通过 UI 手动调用该函数,它将成功归档其余文件。blob 的大小从几 KB 到大约 5 MB 不等,超时错误似乎发生在 2-3 MB 的文件上。一次只运行一个调用,所以我认为我没有超过消耗计划的 1.5GB 内存限制(我python exited with code 137从过去的内存问题中看到)。当它已经完美运行了几个月时,为什么我突然收到这个错误?
更新
我想我将尝试使用此处找到的方法进行存档,这样我就不必在 Python 中将 blob 内容存储在内存中:https ://www.europeclouds.com/blog/moving-files-between-具有 Azure 功能和事件网格的存储帐户

4

1 回答 1

1

只需从评论中总结解决方案供其他社区参考:

如评论中所述,OP 使用start_copy_from_url()方法来实现与解决方法相同的要求。

start_copy_from_url()可以直接从原始blob处理文件到目标blob,它比使用data = blob_from.download_blob()临时存储文件然后上传data到目标blob要快得多。

于 2020-11-27T07:54:33.527 回答