讲师中心 微信公众号
AI工具推荐 视频效率加速

Pandas大数据框分批处理与外部API调用优化实践

秋敏小哥_4044

秋敏小哥_4044

发布时间:2025-09-17 11:54:01

|

872人浏览过

|

来源于php中文网

原创

Pandas大数据框分批处理与外部API调用优化实践

本教程旨在解决Pandas处理大型DataFrame时,因内存限制或外部API请求频率过高导致的程序崩溃及性能瓶颈问题。核心策略是通过将大数据集逻辑地划分为小批次进行独立处理,并演示如何高效地执行数据合并、应用自定义函数以及管理外部API调用,最终将分批处理结果统一写入目标文件,从而提升数据处理的稳定性和效率。

1. 理解大数据处理挑战

在处理包含数十万甚至数百万行数据的大型pandas dataframe时,直接对整个数据集执行复杂操作(如df.merge、df.apply)或频繁调用外部api(如google maps api),极易引发内存溢出、程序崩溃或因api请求频率过高而被限流等问题。尤其当每次api调用耗时且有严格的速率限制时,一次性处理所有数据几乎不可行。解决这些问题的关键在于采用分批处理(batch processing)策略。

2. 核心策略:数据分批处理

分批处理的核心思想是将一个庞大的数据集分解成若干个大小可控的小数据集(批次),然后逐一处理这些批次。这种方法不仅能有效降低单次操作的内存消耗,还能更好地管理外部API的调用频率。

2.1 分批逻辑实现

我们可以利用DataFrame的索引(df.index)结合整数除法(//)来为每一行分配一个批次编号。例如,如果希望每100行作为一个批次,那么df.index // 100就能生成相应的批次号。

以下是一个演示如何创建批次并迭代处理的示例代码:

HML Google Slides
HML Google Slides

创建、编辑和导出 Google Slides 幻灯片。适用于创建新演示文稿、添加或更新幻灯片、读取幻灯片内容、导出为 PDF。

下载
import pandas as pd
import numpy as np
import time
import os

# 模拟一个大型DataFrame
# 实际应用中,这里会是您加载的50万行数据
data_size = 500000
df = pd.DataFrame({
    'id': range(data_size),
    'col_a': np.random.rand(data_size) * 100,
    'address': [f'Address {i}, City {i % 100}' for i in range(data_size)],
    'value_b': np.random.randint(0, 1000, data_size)
})

print(f"原始DataFrame大小: {len(df)} 行")

# 定义批次大小
batch_size = 100

# 为DataFrame中的每一行生成批次号
df['batch_num'] = df.index // batch_size

# 模拟一个外部API调用函数
def call_google_maps_api(address):
    """
    模拟调用Google Maps API,获取经纬度
    实际应用中,这里会是您的requests.get()调用
    """
    # 模拟网络延迟和API处理时间
    time.sleep(0.05) # 每次调用暂停50毫秒,以避免过快请求
    if "City 0" in address: # 模拟某些地址可能失败
        # raise ValueError(f"API Error for address: {address}")
        return f"ERROR: {address}"
    return f"Lat: {hash(address) % 90}, Lng: {hash(address) % 180}"

# 存储最终结果的列表
# 也可以直接写入CSV,下面会介绍两种方式
processed_batches = []
output_csv_path = 'processed_data_batched.csv'

# 如果输出文件已存在,先删除,确保从头开始
if os.path.exists(output_csv_path):
    os.remove(output_csv_path)
    print(f"已删除旧的输出文件: {output_csv_path}")

# 遍历所有唯一的批次号
unique_batches = df['batch_num'].unique()
for i, batch_id in enumerate(unique_batches):
    print(f"正在处理批次 {i+1}/{len(unique_batches)} (批次号: {batch_id})...")

    # 提取当前批次的DataFrame
    # 使用 .copy() 避免SettingWithCopyWarning
    current_batch_df = df[df['batch_num'] == batch_id].copy()

    # --- 在此处对 current_batch_df 执行您的操作 ---

    # 1. 模拟 df.merge 操作 (例如,与另一个小表合并)
    # 假设有一个小的查找表
    lookup_data = pd.DataFrame({
        'id': range(data_size),
        'category': [f'Cat_{i % 5}' for i in range(data_size)]
    })
    # 只合并当前批次所需的查找数据
    current_batch_df = pd.merge(current_batch_df, lookup_data[['id', 'category']], on='id', how='left')

    # 2. 模拟 df.apply 操作,其中包含外部API调用
    # 针对 'address' 列调用模拟的Google Maps API
    try:
        current_batch_df['coordinates'] = current_batch_df['address'].apply(call_google_maps_api)
    except Exception as e:
        print(f"批次 {batch_id} API调用失败: {e}")
        # 可以在这里实现重试逻辑或记录错误
        current_batch_df['coordinates'] = "API_CALL_FAILED" # 标记失败

    # 3. 其他数据转换或计算
    current_batch_df['calculated_col'] = current_batch_df['col_a'] * 2

    # --- 批次处理结束 ---

    # 将处理后的批次数据添加到列表中
    # processed_batches.append(current_batch_df)

    # 替代方案:直接将批次结果写入CSV文件
    # 对于第一个批次,写入头部;对于后续批次,不写入头部并以追加模式写入
    if i == 0:
        current_batch_df.to_csv(output_csv_path, mode='w', index=False, header=True, encoding='utf-8')
    else:
        current_batch_df.to_csv(output_csv_path, mode='a', index=False, header=False, encoding='utf-8')

    # 释放内存 (可选,对于极大的DataFrame可能有用)
    del current_batch_df
    import gc
    gc.collect()

print("\n所有批次处理完成!")

# 如果您选择将所有批次收集到列表中,最后再合并
# final_df = pd.concat(processed_batches, ignore_index=True)
# print(f"最终合并的DataFrame大小: {len(final_df)} 行")
# final_df.to_csv(output_csv_path, index=False, encoding='utf-8')

print(f"处理后的数据已保存到: {output_csv_path}")
final_df_check = pd.read_csv(output_csv_path)
print(f"从CSV读取的数据行数: {len(final_df_check)}")

2.2 处理流程与结果合并

在上述示例中,我们展示了两种处理批次结果的方式:

  1. 收集到列表再合并(注释掉的部分):将每个处理后的current_batch_df添加到processed_batches列表中。在所有批次处理完毕后,使用pd.concat(processed_batches, ignore_index=True)将所有批次合并成一个完整的DataFrame。这种方式适用于最终需要一个完整DataFrame进行后续操作的场景,但会占用更多内存。
  2. 直接追加写入CSV:这是处理大数据集更推荐的方法,尤其是在内存受限或最终目标是生成一个CSV文件时。
    • 对于第一个批次(i == 0),使用mode='w'(写入模式)和header=True来创建文件并写入列头。
    • 对于后续批次(i > 0),使用mode='a'(追加模式)和header=False来将数据追加到现有文件末尾,且不再写入列头。 这种方式能有效避免将所有处理结果同时加载到内存中,从而节省大量内存资源。

3. 外部API请求管理

当分批处理涉及到外部API调用时,必须特别注意API的速率限制(Rate Limiting)和错误处理。

  • 速率限制:大多数API都有每秒、每分钟或每天的请求次数限制。在上述示例中,我们通过time.sleep(0.05)模拟了每次API调用后的延迟,以控制请求频率。实际应用中,您可能需要根据API提供商的具体要求,设置更长的延迟或实现指数退避(Exponential Backoff)策略,即在API返回错误(如429 Too Many Requests)时,等待更长时间再重试。
  • 错误处理:将API调用放在try-except块中,可以捕获网络错误、API响应错误等,并进行相应的处理,例如记录错误、跳过当前条目、使用默认值或实现重试机制。
  • 缓存中间结果:对于耗时或高频调用的API,可以考虑在本地缓存API响应。如果同一地址被多次查询,可以直接从缓存中获取结果,减少实际的API请求。

4. 注意事项与优化建议

  • 批次大小的选择:没有一劳永逸的批次大小。它取决于您的系统内存、数据复杂性、API限制和处理逻辑的计算成本。通常建议从一个较小的批次(如1000或5000行)开始测试,逐步调整以找到最佳平衡点。
  • 内存管理:在每次循环结束时,如果current_batch_df不再需要,可以显式使用del current_batch_df并调用gc.collect()来帮助Python的垃圾回收器释放内存。
  • 进度保存与恢复:对于耗时数小时甚至数天的任务,考虑在每次批次处理完成后,记录已处理的批次号或将中间结果保存到临时文件。这样,如果程序意外中断,您可以从中断点恢复,而不是从头开始。
  • 并行处理(高级):如果API调用是I/O密集型且可以并行执行,可以考虑使用Python的multiprocessing或concurrent.futures模块来并行处理多个批次。但这会增加代码复杂性,并需要更精细的API速率控制。
  • 异常处理和日志记录:在实际生产环境中,为API调用和数据处理逻辑添加详细的异常处理和日志记录,有助于调试和监控程序的运行状态。

5. 总结

通过采用分批处理策略,我们能够有效地管理大型DataFrame的数据处理任务,避免因内存或API限制导致的程序崩溃。核心在于将数据分解为可管理的批次,并在每个批次内部执行所需的合并、计算和API调用。结合适当的API请求管理和错误处理机制,以及将结果增量写入文件,可以显著提升数据处理的稳定性和效率,确保即使面对海量数据和外部服务依赖,也能顺利完成任务。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

320

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

232

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

411

2026.04.13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

80

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

40

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

40

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

60

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

280

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn