首页 > 解决方案 > 如何提高这段代码的内存效率?

问题描述

我正在寻找改进内存占用代码的方法。

以下代码部分的最后一段是尝试从日期时间列创建单独的列。但是,它确实有效,当我键入它时,它在处理时占用了 1.2GB 的 RAM(在 Jupyter 中与加载数据的代码不同的执行单元中)。数据集很大(按照我的标准...... 4m 行),所以我不认为它的执行成本很低。但是,在一次执行期间,我收到了内存错误。

我确信这不是实现这一目标的最有效方法,但是,我不确定我知道如何改进它。是否可以在加载数据集时创建这些值,这样资源密集度会降低吗?还是有更好的方法来实现这一点?

我也愿意接受任何改进代码顶部的建议。它也可能效率不高。

用于加载数据集的代码:

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 中,而是使用了相同的 dataframe,它从内存中释放了 90%,这也有帮助。

标签: pythonpython-3.xpandasstring-to-datetime

解决方案


多亏了评论,我找到了一个解决我的记忆问题的解决方案。

为了解决内存问题,我选择对 10% 的数据进行采样,并仅对采样的数据进行繁重的处理。此外,我没有将采样数据保存到新的 DataFrame 中,而是使用了相同的 dataframe,它从内存中释放了 90%,这也有帮助。


推荐阅读