【问题标题】:Clear memory in Python loop在 Python 循环中清除内存
【发布时间】:2015-10-21 15:04:05
【问题描述】:

如何在这个 Python 循环中清除内存?

import concurrent.futures as futures
with futures.ThreadPoolExecutor(max_workers=100) as executor:
    fs = [executor.submit(get_data, url) for url in link]
    for i, f in enumerate(futures.as_completed(fs)):
        x= (f.result())
        results.append(x)
        del x 
        del f

get_data - 使用请求的简单函数

【问题讨论】:

  • 为什么要删除它们?您面临什么问题?
  • 我正在尝试发送 >100k 的请求。每五千个请求使用 1 GB 内存。
  • 我所做的是将原始的大列表拆分成更小的批次,然后为每个批次运行上述循环。我认为五千个请求,特别是如果几个同时 ping 同一个站点/服务器,可能会给你带来麻烦(即被阻止)。我在尝试缩短网址时遇到了这个问题。
  • 那么,我猜你不喜欢我们的任何答案?

标签: python for-loop memory-management parallel-processing


【解决方案1】:

我的解决方案是这样的:
导入 concurrent.futures 作为期货

#split the original grand list into smaller batches  

batchurlList = [grandUrlList[x:x+batchSize] for x in range(0, len(grandUrlList), batchSize)]
for tmpurlList in batchurlList:
    with futures.ThreadPoolExecutor(max_workers=100) as executor:
        myfuture = {executor.submit(myFunction, url): url for url in tmpurlList}
        for future in futures.as_completed(myfuture, timeout=60):
            originalUrl = myfuture[future]
            results.append(future.result())

【讨论】:

    【解决方案2】:

    我想我最近也遇到了同样的问题,答案不是del而是引入了一个sleep func……试试;

    import time
    import concurrent.futures as futures
    with futures.ThreadPoolExecutor(max_workers=100) as executor:
        fs = [executor.submit(get_data, url) for url in link]
        for i, f in enumerate(futures.as_completed(fs)):
               x= (f.result())
               results.append(x)
               time.sleep(n_seconds)
    

    或者类似的东西(我在 url 列表上使用了一个 while 循环)

    【讨论】:

    • 如果你有 100 个网址,我想没关系。当你拥有数百万时会发生什么?有没有可以使用的最佳 n_seconds?
    • 确实如此。我可能在没有足够信息的情况下做出了一些假设。但是,当存在与在给定时间段内可以发出的请求数量有关的冲突错误时,引入时间延迟是有效的。
    猜你喜欢
    • 2020-12-18
    • 2019-06-30
    • 2019-12-18
    • 2015-11-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多