Как улучшить эффективность памяти этого кода? - PullRequest
0 голосов
/ 19 января 2020

Я ищу способы улучшить код памяти.

Последний фрагмент следующего раздела кода - это попытка создать отдельные столбцы из столбцов даты и времени. Однако он работает, когда я набираю его, он занимает 1,2 ГБ ОЗУ во время обработки (в отдельной ячейке выполнения в Jupyter из кода, загружающего данные). Набор данных большой (по моим стандартам ... 4 м строк), поэтому я не ожидаю, что он будет дешевым для выполнения. Однако во время одного выполнения я получил ошибку памяти.

Я уверен, что это не самый эффективный способ добиться этого, однако я не уверен, что знаю, как ее улучшить. Можно ли создать эти значения во время загрузки набора данных, и это будет менее ресурсоемким? Или есть только лучший способ выполнить sh это?

Я также открыт для любых предложений по улучшению верхней части кода. Вероятно, это также неэффективно.

Код, используемый для загрузки набора данных:

files = os.listdir("./source_files/")

li = []

delimiter = ';'

shrtwkday = CategoricalDtype(categories=['Sun','Mon','Tue','Wed','Thu','Fri','Sat'], ordered=True)

use_cols = ['duration_sec','start_time','end_time','start_station_id','start_station_name','start_station_latitude',
            'start_station_longitude','end_station_id','end_station_name','end_station_latitude',
            'end_station_longitude','bike_id','user_type']

dtypes = {'duration_sec':'int','start_time':'str','end_time':'str','start_station_id':pd.Int64Dtype(),'start_station_name':'str',
          'start_station_latitude':'float','start_station_longitude':'float','end_station_id':pd.Int64Dtype(),
          'end_station_name':'str','end_station_latitude':'float','end_station_longitude':'float',
          'bike_id':'int','user_type':'str'}

parse_dates = ['start_time','end_time']



for file in files:
    with open("./source_files/" + file, 'rb') as f_in:
        df = pd.read_csv(f_in, compression='zip', delimiter=delimiter, usecols = use_cols, dtype=dtypes, 
                         header=0, parse_dates=parse_dates, na_values=['', ' '])
        li.append(df)

trip_df = pd.concat(li, axis=0, ignore_index=True)    

Код, о котором идет речь:

trip_df['start_date'] = trip_df.start_time.dt.strftime('%Y-%m-%d')
trip_df['start_year'] = trip_df.start_time.dt.strftime('%Y').astype(int)
trip_df['start_month'] = trip_df.start_time.dt.strftime('%m').astype(int)
trip_df['start_hour'] = trip_df.start_time.dt.strftime('%H').astype(int)
trip_df['start_weekday'] = trip_df.start_time.dt.strftime('%a').astype(shrtwkday)

trip_df['end_date'] = trip_df.end_time.dt.strftime('%Y-%m-%d')
trip_df['end_year'] = trip_df.end_time.dt.strftime('%Y').astype(int)
trip_df['end_month'] = trip_df.end_time.dt.strftime('%m').astype(int)
trip_df['end_hour'] = trip_df.end_time.dt.strftime('%H').astype(int)
trip_df['end_weekday'] = trip_df.end_time.dt.strftime('%a').astype(shrtwkday)

trip_df['start_date'] = pd.to_datetime(trip_df['start_date'], format = "%Y-%m-%d")
trip_df['end_date'] = pd.to_datetime(trip_df['start_date'], format = "%Y-%m-%d")

РЕДАКТИРОВАТЬ:

Чтобы решить проблему с памятью, я выбрал выборку 10% данных и выполнил тяжелую обработку только выборочных данных. Кроме того, вместо сохранения выбранных данных в новый DataFrame я использовал тот же самый кадр данных, который освободил 90% из памяти, что также помогло.

1 Ответ

0 голосов
/ 22 января 2020

Благодаря комментариям я пришел к решению, которое решило мои проблемы с памятью.

Чтобы решить проблему с памятью, я выбрал выборку 10% данных и выполнил интенсивную обработку только выборочных данных. , Кроме того, вместо сохранения выбранных данных в новом DataFrame я использовал тот же самый кадр данных, который освободил 90% из памяти, что также помогло.

...