我正在尝试抓取多个网页并收集数据。
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。为什么会这样?
我不能把代码放在这里,所以请不要低估这个问题。但有人可以指出我为什么一个过程最终占用了这么多的记忆?
答案 0 :(得分:0)
您将使工作进程生成一些调试输出,以便能够回答您的问题。
使用例如logging
模块用于记录线程何时启动和完成,它们找到多少URL,URL处理的时间。该输出可能会引导您进一步提问。
也许某些页面包含自己的链接,将程序发送到无限循环。