单线程脚本在多核处理器上消耗了太多的cpu

时间:2019-01-09 04:06:37

标签: python python-3.x cpu-usage

我编写了代码,以帮助在一定时间间隔内从非恒定数据集中累积一些数据。它可以在我当前使用的6核处理器(Intel i5-8400)计算机上正常运行,消耗约25%的CPU使用率。问题是,现在我试图在具有40个内核的另一台计算机(Intel Xeon E5-2630 v4)上重新运行相同的代码,而当它启动以下功能时,它会飙升至55%的CPU使用率。预期会接近5%。

这已经成为一个问题,因为我正在与其他人共享这台计算机,这阻碍了他们的工作。比较两台计算机之间运行脚本所花费的时间,这似乎可以忽略不计,因此我不确定它是否实际上在使用所有处理器(这很有意义,因为我不知道如何进行多重处理)线程循环!)

我以前曾试图找到一个答案,但我能找到的最接近的答案可能是由于while循环(Python script too much cpu usage),但我认为这不适用于我的情况。 。其他大多数问题都与如何增加cpu的使用量有关,这与我的问题相反。

def accumulate_value (table_data_1,i_time_step):

    # table_data_1 formatted as a dataframe with columns names ['value','date_time']

    table_data_1.reset_index(drop=True,inplace=True)

    table_data_1["delta_time"] = table_data_1["date_time"].diff(periods=1).dt.seconds/60
    table_data_1["delta_time_aux"] = 0
    table_data_1["value_aux"] = 0
    table_data_1["datetime_stamp"] = pd.to_datetime(0)


    # Start loop

    for aux_counter_1 in table_data_1.index.values.tolist():

        table_data_1_aux1 = table_data_1.loc[aux_counter_1:,:]
        table_data_3 = table_data_1_aux1.loc[table_data_1_aux1.index[table_data_1_aux1.loc[:,'date_time'] - table_data_1_aux1.loc[aux_counter_1,'date_time'] <= datetime.timedelta(minutes=i_time_step)],:]


        if len(table_data_3.index) > 1 :

            table_data_1.iloc[aux_counter_1,3] = datetime.timedelta.total_seconds(table_data_3.iloc[-1,1] - table_data_3.iloc[0,1])/60
            if table_data_1.iloc[aux_counter_1,3] >= i_time_step:
                table_data_1.iloc[aux_counter_1,4] = table_data_3.loc[:,'value'].sum() - table_data_3.iloc[-1,0]
            else:
                table_data_1.iloc[aux_counter_1,4] = table_data_3.loc[:,'value'].sum()
            table_data_1.iloc[aux_counter_1,5] = table_data_3.iloc[-1,1]

        elif len(table_data_3.index) == 1 :
            table_data_1.iloc[aux_counter_1,3] = 0
            table_data_1.iloc[aux_counter_1,4] = table_data_3.loc[:,'value'].sum()
            table_data_1.iloc[aux_counter_1,5] = table_data_3.iloc[-1,1]
        else:
                print(table_data_3)


    table_data_1["year_stamp"] = table_data_1["datetime_stamp"].dt.year

    table_data_2 = table_data_2

    return table_data_2

1 个答案:

答案 0 :(得分:1)

我认为问题在于hat numpy正在创建大量线程,假设它是机器上唯一运行的进程。

有关如何限制使用的线程数,请参见Limit number of threads in numpy