python - Python多线程代码中的内存问题
问题描述
我正在编写代码来获取所有 Azure DataLake 存储文件的大小。我正在使用多线程进程来减少代码的执行时间。
该代码执行以下操作:
- 它获得了我的数据湖的前 3 级文件夹:
- 原始/项目1/2020/01
- 原始/项目1/2020/02
- ...
- 原始/项目N/2020/01
- 它创建4个线程
- 它将每个文件夹放在一个队列中
- 对于每个文件夹,我获取文件夹中的所有文件和大小
- 它将每个文件夹结果写入一个文件
- 它将文件上传到 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 的内存,我如何控制这个内存使用?
解决方案
推荐阅读
- express - 带生成的 Nuxt 服务器中间件
- c++ - 如何正确使用带有子目录的 automake/autoconf?
- ruby-on-rails - active admin many to many show index PG::UndefinedColumn: ERROR: column cases.product_id does not exist
- javascript - 未捕获的类型错误:无法读取未定义的属性“toLowerCase”(WordPress)
- java - 使用 Spring Data JPA 时如何避免 DETACHED 对象或未初始化的 Hibernate 代理?
- numpy - 如何在 keras lambda 层中使用 tf.py_func 来包装 python 代码。ValueError:应定义 Dense 输入的最后一个维度。没有找到
- java - 应用程序崩溃卡在启动画面上 - 返回按钮显示错误
- css - 如何在 Google Page Speed Insights 中删除“预加载密钥请求错误”
- javascript - 用户登录的持久性与 jwt 令牌和重新加载后的反应
- c++ - 左值和右值引用可以合二为一吗?