python - 如何提高这段代码的内存效率?
问题描述
我正在寻找改进内存占用代码的方法。
以下代码部分的最后一段是尝试从日期时间列创建单独的列。但是,它确实有效,当我键入它时,它在处理时占用了 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%,这也有帮助。
解决方案
多亏了评论,我找到了一个解决我的记忆问题的解决方案。
为了解决内存问题,我选择对 10% 的数据进行采样,并仅对采样的数据进行繁重的处理。此外,我没有将采样数据保存到新的 DataFrame 中,而是使用了相同的 dataframe,它从内存中释放了 90%,这也有帮助。
推荐阅读
- azure - 无法在 Azure 门户中保存 JSON 配置文件更新
- javascript - How to autofocus on a specific input field in React (after clicking on another element)?
- flutter - 如何根据 Flutter 中另一个文本字段的值自动设置文本字段的值?
- flutter - 我如何全局处理用户交互?
- r - 插入行以填写 R 中缺少的日期
- angular - 无法在 Windows 10 代理网络系统中安装 angular-cli
- reactjs - React TypeScript - 传递回调函数
- javascript - 将响应正文 blob 转换为 json 或 javascript 中的纯文本
- python-3.x - FileNotFoundError: [Errno 2] No such file or directory -- 即使我使用的是完整路径
- javascript - 如何使用猫鼬将 JSON 中的对象保存在不同的文档中?