Python多处理 - 一个占用大量内存的进程

时间:2016-01-03 19:40:26

标签: python multithreading memory-management multiprocessing

我正在尝试抓取多个网页并收集数据。

pool = multiprocessing.Pool(4, maxtasksperchild=1000)
ret = pool.map(get_data_for_somthing, some_list) #ret not useful

每个进程反过来创建更多线程(使用线程API) 例如,如果网页上有分页,则会创建线程以同时访问每个页面(url)。

所有PROCESSES收集数据并转储到csv(使用pandas)。单个CSV文件不超过500KB。

try:
    dt = get_data_from_wb1(id, start=start, end=end)
    nsdf = get_data_from_wb2(id, start=start, end=end)
    if not nsdf.empty:
        nsdf.drop("Label", axis=1, inplace=True)
        nsdf.insert(0, "some_label", nsdf.index)
        nsdf.insert(0, "id", id)
        nsdf.columns = dbcols
        nsdf["label_new"] = dt["label_new"]
        nsedf.to_csv(path + variable + ".csv")
    else:
        raise Exception("returned null")
except Exception as e:
    logger_map.get(multiprocessing.current_process().name, setup_logger()).error(variable+ " : " + vriable2 + " : " + str(e.args[0]))

上面的代码显示了每个进程的作用以及" get_data _"函数创建更多线程。

我在核心i7四核上有窗口。 那么我应该产生3个进程还是4个进程?一个是主要过程。

主要问题:其中一个产生的进程占用大量内存(5GB),而其他进程占用大约100-200MB。为什么会这样?

我不能把代码放在这里,所以请不要低估这个问题。但有人可以指出我为什么一个过程最终占用了这么多的记忆?

1 个答案:

答案 0 :(得分:0)

您将使工作进程生成一些调试输出,以便能够回答您的问题。

使用例如logging模块用于记录线程何时启动和完成,它们找到多少URL,URL处理的时间。该输出可能会引导您进一步提问。

也许某些页面包含自己的链接,将程序发送到无限循环。