如何避免使用 concurrent.futures() 时的最大内存分配?
How to avoid maximum memory allocation with concurrent.futures() usage?
在下面提供一些我正在使用的代码片段,它运行良好,但在大约 5 分钟的过程中,最终开始抛出 malloc()
类型错误,因为我的笔记本电脑内存使用过多。
如您所见,我什至尝试使用强制 gc.collect()
语句并显式 del
立即设置变量,但无济于事。
代码:
user_guids
和 user_groups_list
对象都是基本列表,每个元素中都有字符串数据。 update_user_groups{}
函数调用 API 并将结果记录到数据库,然后 returns.
编辑: 我已经为 WORKER_THREADS
尝试了不同的值,但无论如何它都会占用内存。我目前在测试时使用 5 到 10 个。降低 max workers 确实会减缓这个问题,但最终会因同样的内存错误而失败。
当前代码(有效,但占用内存):
with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER_THREADS) as executor:
for user in user_guids:
future = executor.submit(update_user_groups, user['Guid'], user_groups_list)
future.add_done_callback(print_future_result)
del future
gc.collect()
我也这样试过(也吃内存):
with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER_THREADS) as executor:
futures = [executor.submit(update_user_groups, user['Guid']) for user in user_guids]
concurrent.futures.wait(futures, return_when=concurrent.futures.ALL_COMPLETED)
我需要它等到所有 futures 都完成,因为它在 Windows 服务中运行,一旦完成就再次 "loops" 。有没有办法像这样使用futures
而不吃内存?是否有替代 "multithreaded" 方法可以在没有内存问题的情况下执行相同的工作?
关于这个的评论不多,所以我会用一个不太好的“答案”来回答我自己的问题……但它确实有效。对代码进行任何更改,我只是更新到 Python 的 64 位版本,它开始正常工作。甚至没有用完与以前相同的内存量。我得到的 2.5GB 的“上限”对我来说是一个危险信号,它尖叫着 32 位问题,所以我切换到 64 位,重建我的虚拟环境,并重新 运行 代码。现在运行良好,内存管理似乎更好!
在下面提供一些我正在使用的代码片段,它运行良好,但在大约 5 分钟的过程中,最终开始抛出 malloc()
类型错误,因为我的笔记本电脑内存使用过多。
如您所见,我什至尝试使用强制 gc.collect()
语句并显式 del
立即设置变量,但无济于事。
代码:
user_guids
和 user_groups_list
对象都是基本列表,每个元素中都有字符串数据。 update_user_groups{}
函数调用 API 并将结果记录到数据库,然后 returns.
编辑: 我已经为 WORKER_THREADS
尝试了不同的值,但无论如何它都会占用内存。我目前在测试时使用 5 到 10 个。降低 max workers 确实会减缓这个问题,但最终会因同样的内存错误而失败。
当前代码(有效,但占用内存):
with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER_THREADS) as executor:
for user in user_guids:
future = executor.submit(update_user_groups, user['Guid'], user_groups_list)
future.add_done_callback(print_future_result)
del future
gc.collect()
我也这样试过(也吃内存):
with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER_THREADS) as executor:
futures = [executor.submit(update_user_groups, user['Guid']) for user in user_guids]
concurrent.futures.wait(futures, return_when=concurrent.futures.ALL_COMPLETED)
我需要它等到所有 futures 都完成,因为它在 Windows 服务中运行,一旦完成就再次 "loops" 。有没有办法像这样使用futures
而不吃内存?是否有替代 "multithreaded" 方法可以在没有内存问题的情况下执行相同的工作?
关于这个的评论不多,所以我会用一个不太好的“答案”来回答我自己的问题……但它确实有效。对代码进行任何更改,我只是更新到 Python 的 64 位版本,它开始正常工作。甚至没有用完与以前相同的内存量。我得到的 2.5GB 的“上限”对我来说是一个危险信号,它尖叫着 32 位问题,所以我切换到 64 位,重建我的虚拟环境,并重新 运行 代码。现在运行良好,内存管理似乎更好!