使用Python高效地将多个azure容器复制到新创建的容器

使用Python高效地将多个azure容器复制到新创建的容器,python,python-3.x,blob,azure-storage,azure-storage-blobs,Python,Python 3.x,Blob,Azure Storage,Azure Storage Blobs,我正在Azure storage explorer中复制多个容器中的内容,并将其写入一堆新容器中,我想知道最有效的方法 现有容器称为cycling-input-1、cycling-input-2等,。。。。内容被写入名为cycling-output-1、cycling-output-2等的新容器。这些容器都是相同类型的(JPEG) 下面的for循环使用所需的后缀创建一个新容器(循环输出),然后将blob从相关的循环输入容器复制到此处。我有大约30个容器,每个容器中有1000个图像,所以不确定这是

我正在Azure storage explorer中复制多个容器中的内容,并将其写入一堆新容器中,我想知道最有效的方法

现有容器称为cycling-input-1、cycling-input-2等,。。。。内容被写入名为cycling-output-1、cycling-output-2等的新容器。这些容器都是相同类型的(JPEG)

下面的for循环使用所需的后缀创建一个新容器(循环输出),然后将blob从相关的循环输入容器复制到此处。我有大约30个容器,每个容器中有1000个图像,所以不确定这是否是最好的方法(速度很慢)。有更好的方法吗

from azure.storage.blob.baseblobservice import BaseBlobService
account_name   = 'name'
account_key    = 'key'

# connect to the storage account
blob_service = BaseBlobService(account_name = account_name, account_key = account_key)

# get a list of the containers that need to be processed
cycling_containers = blob_service.list_containers(prefix = 'cycling-input')

# check the list of containers
for c in cycling_containers:
    print(c.name)


# copy across the blobs from existing containers to new containers with a prefix cycling-output 
prefix_of_new_container = 'cycling-output-'

for c in cycling_containers:
    contname = c.name
    generator = blob_service.list_blobs(contname)
    container_index = ''.join(filter(str.isdigit, contname))
    for blob in generator:
        flag_of_new_container = blob_service.create_container("%s%s" % (prefix_of_new_container, container_index))
        blob_service.copy_blob("%s%s" % (prefix_of_new_container, container_index), blob.name, "https://%s.blob.core.windows.net/%s/%s" % (account_name, contname, blob.name))

简单的方法是使用
多处理
模块将所有容器的这些blob并行复制到它们的新容器中,方法是将
输入
替换为
输出

这是我的示例代码作为参考

from azure.storage.blob.baseblobservice import BaseBlobService
import multiprocessing

account_name = '<your account name>'
account_key = '<your account key>'

blob_service = BaseBlobService(
    account_name=account_name,
    account_key=account_key
)

cycling_containers = blob_service.list_containers(prefix = 'cycling-input')

def putBlobCopyTriples(queue, num_of_workers):
    for c in cycling_containers:
        container_name = c.name
        new_container_name = container_name.replace('input', 'output')
        blob_service.create_container(new_container_name)
        for blob in blob_service.list_blobs(container_name):
            blob_url = "https://%s.blob.core.windows.net/%s/%s" % (account_name, container_name, blob.name)
            queue.put( (new_container_name, blob.name, blob_url) )
    for i in range(num_of_workers):
        queue.put( (None, None, None) )

def copyWorker(lock, queue, sn):
    while True:
        with lock:
            (new_container_name, blob_name, new_blob_url) = queue.get()
        if new_container_name == None:
            break
        print(sn, new_container_name, blob_name, new_blob_url)
        blob_service.copy_blob(new_container_name, blob_name, new_blob_url)

if __name__ == '__main__':
    num_of_workers = 4 # the number of workers what you want, for example, 4 is my cpu core count
    lock = multiprocessing.Lock()
    queue = multiprocessing.Queue()
    multiprocessing.Process(target = putBlobCopyTriples, args = (queue, num_of_workers)).start()
    workers = [multiprocessing.Process(target = copyWorker, args = (lock, queue, i)) for i in range(num_of_workers)]
    for p in workers:
        p.start()
从azure.storage.blob.baseblobservice导入baseblobservice
导入多处理
帐户名称=“”
帐户密钥=“”
blob_服务=BaseBlobService(
账户名称=账户名称,
帐户密钥=帐户密钥
)
循环\u容器=blob\u服务。列出\u容器(前缀='循环输入')
def putBlobCopyTriples(队列,工作人员数量):
对于循环容器中的c:
容器名称=c.name
新建容器名称=容器名称。替换('input','output')
blob\u服务。创建\u容器(新的\u容器\u名称)
对于blob_服务中的blob。列出blob(容器名称):
blob\u url=“https://%s.blob.core.windows.net/%s/%s”%(帐户名、容器名、blob.name)
put((新容器名称、blob.name、blob\url))
对于范围内的i(工人数量):
queue.put((无,无,无))
def copyWorker(锁、队列、序列号):
尽管如此:
带锁:
(new_container_name、blob_name、new_blob_url)=queue.get()
如果新容器名称==无:
打破
打印(序列号、新容器名称、blob\u名称、新blob\u url)
blob_服务。复制blob(新容器名称、blob_名称、新blob_url)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
num_of_workers=4#所需的工作人员数量,例如,4是我的cpu核心计数
lock=multiprocessing.lock()
队列=多处理。队列()
multiprocessing.Process(target=putBlobCopyTriples,args=(队列,工作人员数)).start()
workers=[multiprocessing.Process(target=copyWorker,args=(lock,queue,i))对于范围内的i(num_of_workers)]
对于工人中的p:
p、 开始()

注意:除了环境中的cpu核心数外,复制速度限制取决于IO带宽。工人人数不是越多越好。建议该数字等于或小于您的cpu数或超线程数。

回答得很好,这对我帮助很大,谢谢!一个小问题:当我们执行
queue.get()
时,为什么需要带锁的
?我在文档中似乎找不到关于
Lock()
的更多信息。