Я наблюдаю некоторые странные проблемы во время выполнения с PyCharm, которые описаны ниже. Код был запущен на машине с 20 ядрами и 256 ГБ ОЗУ, и для его резервирования достаточно памяти. Я не показываю никаких реальных функций, так как это достаточно большой проект, но более чем рад добавить детали по запросу.
Короче говоря, у меня есть .py
файл проекта со следующей структурой:
import ...
import ...
cpu_cores = control_parameters.cpu_cores
prng = RandomState(123)
def collect_results(result_list):
return pd.DataFrame({'start_time': result_list[0::4],
'arrival_time': result_list[1::4],
'tour_id': result_list[2::4],
'trip_id': result_list[3::4]})
if __name__ == '__main__':
# Run the serial code
st = starttimes.StartTimesCreate(prng)
temp_df, two_trips_df, time_dist_arr = st.run()
# Prepare the dataframe to sample start times. Create groups from the input dataframe
temp_df1 = st.prepare_two_trips_more_df(temp_df, two_trips_df)
validation.logger.info("Dataframe prepared for multiprocessing")
grp_list = []
for name, group in temp_df1.groupby('tour_id'): ### problem lies here in runtimes
grp_list.append(group)
validation.logger.info("All groups have been prepared for multiprocessing, "
"for a total of %s groups" %len(grp_list))
################ PARALLEL CODE BELOW #################
Цикл for выполняется на фрейме данных из 10,5 миллионов строк и 18 столбцов. В текущей форме для создания списка групп (2,8 млн. Групп) требуется около 25 минут . Эти группы создаются и затем передаются в многопроцессорный пул, код для которого не показан.
Требуемые 25 минут - это довольно много, поскольку я также выполнил следующий тестовый прогон, который занимает всего 7 минут . По сути, я сохранил файл temp_df1 в CSV, а затем просто упаковал его в предварительно сохраненный файл и запустил тот же для цикла , как и раньше.
import ...
import ...
cpu_cores = control_parameters.cpu_cores
prng = RandomState(123)
def collect_results(result_list):
return pd.DataFrame({'start_time': result_list[0::4],
'arrival_time': result_list[1::4],
'tour_id': result_list[2::4],
'trip_id': result_list[3::4]})
if __name__ == '__main__':
# Run the serial code
st = starttimes.StartTimesCreate(prng)
temp_df1 = pd.read_csv(r"c:\\...\\temp_df1.csv")
time_dist = pd.read_csv(r"c:\\...\\start_time_distribution_treso_1.csv")
time_dist_arr = np.array(time_dist.to_records())
grp_list = []
for name, group in temp_df1.groupby('tour_id'):
grp_list.append(group)
validation.logger.info("All groups have been prepared for multiprocessing, "
"for a total of %s groups" %len(grp_list))
ВОПРОС
Итак, что же заставляет код работать в 3 раза быстрее, когда я просто пакетирую файл, по сравнению с тем, когда файл создается как часть функции, расположенной выше по потоку?
Заранее спасибо, пожалуйста, дайте мне знать, как я могу уточнить.