首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >upload_blob函数中的Azure python异步内存耗尽

upload_blob函数中的Azure python异步内存耗尽
EN

Stack Overflow用户
提问于 2020-04-09 04:06:58
回答 1查看 320关注 0票数 2

我有一个asyncio python azure脚本,它使用多个任务将文件从asyncio队列上传到blob。它工作得很好,至少在耗尽系统上所有可用内存之前是这样。我找不到内存泄漏的地方。通常我使用内存分析器,但这似乎不适用于异步函数。

有人能告诉我我做错了什么吗,或者找出问题所在的最好方法是什么?谢谢。如果有的话,我不清楚有什么东西没有被清理。

我将几百到几千个文件放在工作队列中,通常运行3-5个任务。在几分钟的时间内,这个程序会用完3到6 6GB的驻留内存,然后开始吞噬交换空间,直到它运行足够长的时间后,它会因内存匮乏而被杀死。这是在一个8 8GB内存的linux机器上,使用Python 3.6.8和以下azure库:

azure-通用1.1.25

azure-核心1.3.0

azure-identity 1.3.0

azure-nspkg 3.0.2

azure-存储-blob 12.3.0

代码语言:javascript
复制
from azure.identity.aio import ClientSecretCredential
from azure.storage.blob.aio import BlobClient

async def uploadBlobsTask(taskName, args, workQueue):
    while not workQueue.empty():
        fileName = await workQueue.get()
        blobName = fileName.replace(args.sourceDirPrefix, '')

        blobClient = BlobClient(
            "https://{}.blob.core.windows.net".format(args.accountName),
            credential = args.creds,
            container_name = args.container,
            blob_name = blobName,
        )

        async with blobClient:
            args.logger.info("Task {}: uploading {} as {}".format(taskName, fileName, blobName))
            try:
                with open(fileName, "rb") as data:
                    await blobClient.upload_blob(data, overwrite=True)
                fileNameMoved = fileName + '.moved'
                with open(fileNameMoved, "w") as fm:
                    fm.write("")
            except KeyboardInterrupt:
                raise
            except:
                args.logger.error("Task {}: {}".format(taskName, traceback.format_exc()))
                await workQueue.put(fileName)
            finally:
                workQueue.task_done()


async def processFiles(args):
    workQueue = asyncio.Queue()

    for (path, dirs, files) in os.walk(args.sourceDir):
        for f in files:
            fileName = os.path.join(path, f)                               
            await workQueue.put(fileName)

    creds = ClientSecretCredential(args.tenant, args.appId, args.password)
    args.creds = creds
    tasks = [ args.loop.create_task(uploadBlobsTask(str(i), args, workQueue)) for i in range(1, args.tasks+1) ]
    await asyncio.gather(*tasks)
    await creds.close()


loop = asyncio.get_event_loop()
args.loop = loop
loop.run_until_complete(processFiles(args))
loop.close()
EN

回答 1

Stack Overflow用户

发布于 2020-04-10 00:27:21

不管它有什么价值,我似乎已经设法修复了这个问题,这样它就可以在没有内存泄漏的情况下工作。为此,我先获取了一个containerClient,然后从中获取了blobClients (即containerClient.get_blob_client()),而不是直接获取BlobClient对象。现在,总体内存使用量达到了一个非常低的水平,而不是像以前那样持续增长。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61109155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档