Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AWS EC2上,使用32核的多处理Python代码比使用16核的慢_Python_Amazon Ec2_Multiprocessing - Fatal编程技术网

在AWS EC2上,使用32核的多处理Python代码比使用16核的慢

在AWS EC2上,使用32核的多处理Python代码比使用16核的慢,python,amazon-ec2,multiprocessing,Python,Amazon Ec2,Multiprocessing,我不明白为什么在AWS EC2 c3.8XL上使用28-30核时,我的计算时间比使用12-16核时长。我做了一些测试,结果如下图所示: 最快的计算是当我使用13个核时。因此,如果我使用最大核数,这与我使用8个c3.8XL的核数相同: 这是我使用的简化代码 import random import multiprocessing as mp import threading as th import numpy as np x=mp.Value('f',0) y=mp.Value('f',0

我不明白为什么在AWS EC2 c3.8XL上使用28-30核时,我的计算时间比使用12-16核时长。我做了一些测试,结果如下图所示:

最快的计算是当我使用13个核时。因此,如果我使用最大核数,这与我使用8个c3.8XL的核数相同:

这是我使用的简化代码

import random
import multiprocessing as mp
import threading as th
import numpy as np

x=mp.Value('f',0)
y=mp.Value('f',0)
arr=[]
tasks=[]
nesto=[]

def calculation2(some_array):
    global x, y, arr
    p=False
    a = np.sum(some_array)*random.random()
    b = a **(random.random())
    if a > x.value:
        x.value=a
        y.value=b
        arr=some_array
        p=True
    if p:
        return x.value, y.value, arr

def calculation1(number_of_pool):
    global tasks
    pool=mp.Pool(number_of_pool)
    for i in range(1,500):
        some_array=np.random.randint(100, size=(1, 4))
        tasks+=[pool.apply_async(calculation2,args=(some_array,))]

def exec_activator():
    global x, y, arr
    while tasks_gen.is_alive() or len(tasks)>0:
        try:
            task=tasks.pop(0)
            x.value, y.value, arr = task.get()
        except:
            pass

def results(task_act):
    while task_act.is_alive():
        pass
    else:
        print x.value
        print y.value
        print arr

tasks_gen=th.Thread(target=calculation1,args=(4,))
task_act=th.Thread(target=exec_activator)
result_print=th.Thread(target=results,args=(task_act,))

tasks_gen.start()
task_act.start()
result_print.start()
它的核心是两个计算:

  • 计算1-计算阵列并为计算2制作作业 使用该阵列
  • 计算2-计算数组外的某些计算并比较结果
代码的目标是找到计算最大x的数组,并返回其y。 这两个计算同时开始(使用线程),因为有时有太多的阵列占用了太多的RAM

我的目标是做最快的计算。我需要建议如何使用所有的核心,如果可能的话


如果英语不好,请提前道歉。如果您需要更多信息,请询问。

c3.8XL是一款常春藤桥四核系统。它使用超线程;它实际上没有32个(硬件)独立的处理单元

试图在更多的操作系统进程之间并行执行CPU限制的任务,而不是在硬件中并行它们的处理器,这通常是没有意义的。事实上,这通常是有害的,因为资源开销和上下文切换(这就是您所看到的)


这可能取决于您的具体应用程序,而实验将帮助您找到最佳点(听起来您已经这样做了)。

与可用RAM相比,内核太多,您可能正在使用虚拟内存(为了简化,与磁盘交换),这很容易降低您的速度。唯一的通用解决方案是获得更多的RAM。根据任务的具体情况,以正确的顺序从磁盘实际工作可能比将其全部放入虚拟的“内存”要快。或者,如果您可以使用本地SSD作为“磁盘”,则可以提供更快的随机访问(我不知道如何在AWS中做到这一点,只在Google云平台上)。我使用psutil来监控处理器和RAM。在测试数据上,它最多使用2-3%的RAM。我在Ubuntu服务器(EBS)上传输所有数据和python代码。如何测试它,我在一个微实例上运行它,并在0.2s
[[86 44 89 88]]中得到更少的结果\n real 0m0.175s
该代码是简化的代码,在任何计算机上都非常快速,我把它放在这里只是为了展示我如何构造真正的代码。这里我只是放置一些随机数组来计算一些随机数据。真正的代码是3-4倍长,更复杂,它取决于我硬盘上的盘中股票数据。Def和变量是用我的母语编写的,所以我必须做很多修改才能在这里显示出来。据你所知,有32个超线程,而不是物理内核。