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