Python 带线程的基本Mapreduce比顺序版本慢

Python 带线程的基本Mapreduce比顺序版本慢,python,multithreading,mapreduce,Python,Multithreading,Mapreduce,我正在尝试使用线程使用mapreduce执行单词计数器,但是这个版本比顺序版本慢得多。对于300MB的文本文件,mapreduce版本大约需要80秒,而顺序版本则需要更少的时间。我的问题是因为不理解为什么,因为我已经完成了map reduce的所有阶段(split、mapping、shuffle、reduce),但是我不明白为什么它会慢一些,因为我已经使用了大约6个线程来做测试。我在想,与执行时间相比,线程的创建可能是昂贵的,但由于它需要大约80秒的时间,我认为这显然不是问题所在。你能看看代码是

我正在尝试使用线程使用mapreduce执行单词计数器,但是这个版本比顺序版本慢得多。对于300MB的文本文件,mapreduce版本大约需要80秒,而顺序版本则需要更少的时间。我的问题是因为不理解为什么,因为我已经完成了map reduce的所有阶段(split、mapping、shuffle、reduce),但是我不明白为什么它会慢一些,因为我已经使用了大约6个线程来做测试。我在想,与执行时间相比,线程的创建可能是昂贵的,但由于它需要大约80秒的时间,我认为这显然不是问题所在。你能看看代码是什么吗?我很确定代码运行得很好,问题是我不知道是什么导致了速度慢。
最后一件事,当使用超过300MB的文本文件时,程序会填满我电脑的所有ram内存,有没有办法对其进行优化?

首先,有几条免责声明:

  • 要知道应用程序运行缓慢的确切原因,您需要对其进行分析。在这个回答中,我给出了一些常识推理
  • 我假设你用的是cPython
  • 当您并行化某些算法时,有几个因素会影响性能。其中一些支持速度(我会用
    +
    标记它们),另一些则反对(
    -
    )。让我们来看看它们:

  • 您需要先拆分工作(-)
  • 并行工作同时完成(+)
  • 并行工作人员可能需要同步其工作(-)
  • 减少所需时间(-)
  • 为了让你们们的并行算法给你们们一些收益,相对于顺序算法,你们们需要所有加速的因素都超过所有拖累你们们的因素

    此外,与顺序处理相比,#2的收益应该足够大,以补偿您需要做的额外工作(这意味着对于一些
    小的
    数据,您不会得到任何提升,因为协调开销将更大)

    现在实施中的主要问题是第2项和第3项

    首先,工人们没有并行工作。并行化的任务部分受CPU限制。在python中,单个进程的线程不能使用多个CPU。所以在这个程序中,它们永远不会并行执行。它们共享同一个CPU

    此外,他们在DICT上执行的每个修改操作都使用锁定/解锁,这比不需要同步的顺序版本慢得多

    要加快算法速度,您需要:

  • 使用多处理而不是多线程(这样可以使用多个CPU进行处理)
  • 以一种不需要工作人员在工作时进行同步的方式构造算法(每个工作人员应使用自己的dict存储中间结果)

  • 我理解。。。因此,我将尝试多处理。谢谢