однопоточный скрипт потребляет слишком много процессора на многоядерном процессоре - PullRequest
0 голосов
/ 09 января 2019

Я написал код, помогающий накапливать некоторые данные за постоянный интервал времени из набора непостоянных данных. Он работает, как и ожидалось, на моем текущем компьютере, который является 6-ядерным процессором (Intel i5-8400) и потребляет ~ 25% загрузки ЦП. Проблема в том, что сейчас я пытаюсь перезапустить тот же код на другом компьютере, который имеет 40 ядер (Intel Xeon E5-2630 v4), и, как только он запускает следующую функцию, он достигает 55% загрузки ЦП, в то время как я был ожидая, что это будет ближе к 5%.

Это стало проблемой, потому что я делюсь этим компьютером с другими людьми, и это мешает их работе. Сравнение времени, необходимого для запуска сценария между двумя компьютерами, кажется незначительным, поэтому я не уверен, использует ли он фактически все процессоры (что имеет смысл, поскольку я понятия не имею, как нити петли!)

Ранее я пытался найти ответ, и самый близкий ответ, который я смог найти, заключался в том, что это может быть из-за цикла while ( Сценарий Python слишком загружен процессором ), но я не думаю, что применимо к моему случаю ... Большинство других вопросов было связано с тем, как увеличить использование процессора, что противоположно моей проблеме.

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 голосов
/ 09 января 2019

Я думаю, что проблема в том, что numpy создает большое количество потоков, предполагая, что это единственный процесс, запущенный на машине.

См. Ограничение количества потоков в numpy , чтобы узнать, как ограничить количество используемых потоков.

...