首页 > 解决方案 > Python多线程代码中的内存问题

问题描述

我正在编写代码来获取所有 Azure DataLake 存储文件的大小。我正在使用多线程进程来减少代码的执行时间。

该代码执行以下操作:

  1. 它获得了我的数据湖的前 3 级文件夹:
  1. 它创建4个线程
  2. 它将每个文件夹放在一个队列中
  3. 对于每个文件夹,我获取文件夹中的所有文件和大小
  4. 它将每个文件夹结果写入一个文件
  5. 它将文件上传到 StorageAccount



    def downloadFolder(adls_path):
        #return 
        try:
            return getAllSubdirectories(adls_client, adls_path)
        except PermissionError:
            #write folder into file

    class DownloadWorker(Thread):

        def __init__(self, queue):
            Thread.__init__(self)
            self.queue = queue

        def run(self):
            while True:
                directory = self.queue.get()
                try:
                    data = downloadFolder(directory)
                    if data is not None:         
                        upload_file_to_blob(sa_tenant, sa_client, sa_secret,
                                            sa_name, sa_container,
                                            file_path)
                    else:
                        print(Empty folder)
                finally:
                    self.queue.task_done()

    if __name__ == "__main__":
        adls_client = connectADLS(
            sa_tenant(), sa_client, sa_secret, adls_name
        rootFolders = getSubdirectories(adls_client, adls_root_dir)
        random.shuffle(rootFolders)
        queue = Queue()
        for i in range(4):
            worker = DownloadWorker(queue)
            worker.daemon = True
            worker.start()
        for Folder in rootFolders:
            queue.put((Folder))
        queue.join()
        sys.exit(0)

使用 memory_profiler 监控内存我看到内存的增加永远不会下降:

在此处输入图像描述

如果创建的最大文件超过 300 MB,为什么我使用 2000 MiB 的内存,我如何控制这个内存使用?

标签: pythonmultithreadingout-of-memory

解决方案


推荐阅读