Python: Pycharm Runtime - PullRequest
       6

Python: Pycharm Runtime

0 голосов
/ 02 июля 2018

Я наблюдаю некоторые странные проблемы во время выполнения с 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 раза быстрее, когда я просто пакетирую файл, по сравнению с тем, когда файл создается как часть функции, расположенной выше по потоку?

Заранее спасибо, пожалуйста, дайте мне знать, как я могу уточнить.

1 Ответ

0 голосов
/ 04 июля 2018

Я отвечаю на свой вопрос, когда наткнулся на ответ, выполняя кучу тестов, и, к счастью, когда я прибегнул к поиску решения, у кого-то еще была такая же проблема . Объяснение того, почему наличие категориальных столбцов является плохой идеей при выполнении операций group_by, можно найти по ссылке выше. Таким образом, я не собираюсь размещать это здесь. Благодарю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...