单线程脚本在多核处理器上消耗过多 cpu
single threaded script is consuming too much cpu on a multi core processor
我编写了一段代码来帮助在恒定时间间隔内从非常量数据集中积累一些数据。它在我当前的 6 核处理器(Intel i5-8400)计算机上按预期工作,消耗了 CPU 使用量的 ~25%。问题是,现在我正在尝试在另一台具有 40 个内核(Intel Xeon E5-2630 v4)的计算机上重新 运行 相同的代码,并且一旦启动以下功能,它就会飙升至 55% CPU 使用率,而我预计它会接近 5%。
这已成为一个问题,因为我与其他人共用这台计算机,这妨碍了他们的工作。比较两台计算机之间 运行 脚本所花费的时间,它似乎可以忽略不计,所以我不确定它是否真的使用了所有处理器(这是有道理的,因为我不知道如何进行多线程循环!)
我之前曾试图找到答案,我能找到的最接近的答案是它可能是由于 while 循环 () 但我认为这不适用于我的情况... 大多数其他问题都与如何增加 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
我认为问题是 numpy 正在创建大量线程,假设它是机器上唯一的进程 运行。
请参阅 了解如何限制使用的线程数。
我编写了一段代码来帮助在恒定时间间隔内从非常量数据集中积累一些数据。它在我当前的 6 核处理器(Intel i5-8400)计算机上按预期工作,消耗了 CPU 使用量的 ~25%。问题是,现在我正在尝试在另一台具有 40 个内核(Intel Xeon E5-2630 v4)的计算机上重新 运行 相同的代码,并且一旦启动以下功能,它就会飙升至 55% CPU 使用率,而我预计它会接近 5%。
这已成为一个问题,因为我与其他人共用这台计算机,这妨碍了他们的工作。比较两台计算机之间 运行 脚本所花费的时间,它似乎可以忽略不计,所以我不确定它是否真的使用了所有处理器(这是有道理的,因为我不知道如何进行多线程循环!)
我之前曾试图找到答案,我能找到的最接近的答案是它可能是由于 while 循环 (
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
我认为问题是 numpy 正在创建大量线程,假设它是机器上唯一的进程 运行。
请参阅