使用pandas的Python多处理并非所有进程都在同时运行

时间:2017-12-16 10:05:46

标签: python pandas multiprocessing

enter image description here

我正在读取块中的csv并将块传递给4个进程池。

pool = Pool(processes=4)
            chunk_index = 1
            for df in pd.read_csv(downloaded_file, chunksize=chunksize, compression='gzip', skipinitialspace=True, encoding='utf-8'):
                output_file_name = output_path + merchant['output_file_format'].format(
                    file_index, chunk_index)
                pool.map(wrapper_process, [
                         (df, transformer, output_file_name)])
                chunk_index += 1

使用这段代码,我的理解是它应该向我展示4个连续运行的过程。但是在下面的htop截图中,它始终是2运行。一个是htop命令它自己。这意味着当时只有1个python进程在运行。

enter image description here 从内存使用情况来看,它是12 gb,我认为只有当4个块加载到内存中时才有可能提供1个块几乎是2gb

我如何一次性使用处理器。

1 个答案:

答案 0 :(得分:0)

问题在于你误解了地图是如何运作的。 来自the doc

  

map(func, iterable[, chunksize])   此方法将迭代器切割为它提交的多个块   将进程池作为单独的任务。这些(近似)的大小   可以通过将chunksize设置为正整数来指定块。

作为iterable,您提供的列表只包含一个元素:元组(df, ...)。 但是你需要提供一个包含许多元素的iterable。要做到这一点,你需要 首先准备列表,然后将其发送到进程(提示: 你可以写Pool()并让python找出核心数 本身)

pool = Pool()
chunk_index = 1
list = []
for df in pd.read_csv(downloaded_file, 
        chunksize=chunksize, 
        compression='gzip', 
        skipinitialspace=True, 
        encoding='utf-8'):
    output_file_name = output_path + 
        merchant['output_file_format'].format(file_index, chunk_index)
    list.append((df, transformer, output_file_name)])
    chunk_index += 1
pool.map(wrapper_process, list)

但现在您遇到了需要保存完整csv数据的问题 内存可能可以,但通常不是。解决这个问题 你可以切换到使用队列:你会

  • 建立一个空队列
  • 启动进程并告诉他们从队列中获取项目(开始时仍为空)
  • 使用您的主进程提供队列(并且可能检查队列是否过长,因此内存消耗不会进入屋顶)。
  • 将一个STOP元素放入队列,以便进程自行退出

the official doc (look at the last example on the page)中有一个很好的例子,它解释了你会接近它。

最后一句话:您确定您的操作受CPU限制吗?你做了很多 处理wrapper_process(可能还有transformer)?因为如果您只是单独拆分CSV 没有太多处理程序的文件是IO绑定而不是CPU绑定 然后多处理没有任何意义。