Python 多处理的内存消耗

Python 多处理的内存消耗,python,multiprocessing,Python,Multiprocessing,我试图利用python中的多处理来处理非常大的数据帧。实际上,当我运行下面的代码时,我注意到内存消耗正在增加。 在代码中,数据帧(df)在所有进程中共享,每个进程使用它根据一些过滤器从大型df中提取子df。大型df包含约600万条记录 def prob(optimalK, mapping_dictionary,df,url): subDF = df.loc[df['URL'] == url] tmp_c = 0 * optimalK; mapping_dictionary[url]

我试图利用python中的多处理来处理非常大的数据帧。实际上,当我运行下面的代码时,我注意到内存消耗正在增加。 在代码中,数据帧(df)在所有进程中共享,每个进程使用它根据一些过滤器从大型df中提取子df。大型df包含约600万条记录

def prob(optimalK, mapping_dictionary,df,url):
  subDF = df.loc[df['URL'] == url]
  tmp_c = 0 * optimalK;
  mapping_dictionary[url] = tmp_c

def grouper(n, iterable, padvalue=None):
  return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

if __name__ == '__main__':
   .............
   uniqueURLs = df.URL.unique();
   manager = Manager()
   mapping_dictionary=manager.dict()
   numCores = multiprocessing.cpu_count()
   print(numCores)
   pool = Pool(processes=numCores)

   for chunk in grouper(1000, uniqueURLs):
     print("Start Processing 1000 .... ");
     func = partial(prob, optimalK, mapping_dictionary,df)
     pool.map(func, chunk)
     print("End Processing 1000.... ");

   pool.close()
   pool.join()
有趣的是,我注意到真正导致内存消耗的是prob函数-->subDF=df.loc[df['URL']==URL]中的这一行


我不知道为什么。loc增加了这么多内存消耗。是否有人能提出一种更有效的方法来实现.loc的相同目的,以及如何使我的代码运行得更快

不幸的是,Python有GIL问题(你可以在谷歌上搜索)。简而言之,这意味着没有两个Python线程可以同时处理数据结构。它简单地使Python解释器的实现变得不那么复杂,而且更加健壮

因此,解决方案通常是使用多个进程而不是线程

然而,使用进程的缺点是它们不共享内存(即使您这样称呼它)。如果他们要处理相同的数据,他们都需要一份单独的数据副本

这特别意味着两件事:① 记忆被填满(正如你所注意到的),并且② 在一个进程中写入不会更改另一个进程的数据结构

因此,通常我会建议切换到线程(它们确实共享数据结构)来解决这个问题,但正如一开始所述,由于GIL问题,一些线程通常不会在Python中加快速度。它们更适合于实现对各种源的反应性,或者实现需要并行性的算法

因此,在您的情况下,如果可以的话,我建议您接受内存消耗,或者切换到另一种语言,或者搜索是否可以找到一个现成的Python模块(在内部使用线程或更聪明的子进程)


但是,如果由于大量网络流量(向各种服务器发送大量查询),您的工作耗时较长,需要加快速度,然后,使用线程而不是子进程对您来说是一个完美的解决方案,因为网络流量意味着需要等待大量网络,在此期间其他线程可以正常运行。

使用多处理时,需要序列化和反序列化参数(包括df)。在您将其传递给函数和新流程之前,可能值得进行筛选。感谢@Alfe提供详细信息。。。。你有其他语言的建议可以处理我的案子吗