项目场景:
对从数据库导出的原始CSV数据进行更新,使用Python完成
问题描述:
网上建议使用pandas包的DataFrame处理方便高效,比csv包好。但执行时非常慢,1600万行记录(1.6GB),跑了5小时都没结束(4列置空,1列Hash)
# 需要hash的示例代码
for field in field_list:
for i in range(0, len(csv_df.index)):
if not pd.isnull(csv_df[field][i]):
csv_df[field][i] = hashlib.sha256(str(csv_df[field][i]).encode('utf8')).hexdigest()
# 需要置空的示例代码
for field in field_list:
for i in range(0, len(csv_df.index)):
if not pd.isnull(csv_df[field][i]):
csv_df[field][i] = ''
原因分析:
- 需要置空的字段,根本不需要循环读取所有行,DataFrame支持可以将整列设置为一个值。
- 搜索网上资料发现,使用[字段名][行号]方式去读取数据速度非常慢,改为使用索引(?)at(行号, 字段名)后,速度快了很多
解决方案:
优化后的代码示例如下,之前同样的表,最后1-2分钟就处理完成了(32G内存)
# 需要hash的示例代码
for field in field_list:
for i in range(0, len(csv_df.index)):
if not pd.isnull(csv_df.at[i, field2]):
csv_df.at[i, field] = hashlib.sha256(str(csv_df.at[i, field]).encode('utf8')).hexdigest()
# 需要置空的示例代码
for field in field_list:
csv_df[field] = ""
在处理1600万行、1.6GB大小的CSV数据时,使用pandas DataFrame起初耗时5小时。通过分析,发现直接设置整列值而非逐行操作能显著提升效率。改用索引at方法后,处理时间降至1-2分钟。
336

被折叠的 条评论
为什么被折叠?



