gpt4 book ai didi

python - 如何并行化包含后请求 API 调用的 python 中的 for 循环?

转载 作者:太空宇宙 更新时间:2023-11-03 15:41:34 25 4
gpt4 key购买 nike

我有一个非常大的数据集(7100 万行 - ~7GB csv 文件),我已将其加载到 pandas 的数据框中。

我需要在对 API 的后请求调用中发送数据帧中的每一行,然后将响应存储到另一个数据帧中,稍后导出并分析

目前我的代码是这样的

##read data from csv

for row in data.itertuples(index=True, name='Pandas'):
##There is an if-else ladder to create a header depending on the type of values in a row

##Code to create a json payload

r = requests.post(url, data=json.dumps(payload), headers=headers)
t = json.loads(r.text)

## A try and except block to add the data sent via header and payload + the response from API call back into a new data-frame. (exception is in case there is no response from the API)

##write the data back to csv

API 可以处理大约 50,000 以上的 QPS(每秒查询数),但是这种执行方法只能达到大约 11 QPS。在我之前的测试中,我将一组较小的数据(大约 700 万行)拆分了 4 次,并使用相同的代码运行了 4 个不同的 Jupyter 笔记本,因此有效地达到了大约 44-50 的 QPS 并运行了 24 小时的代码。

注意:我不想用那么多的 QPS 来打它,因为它是一个生产 API,我已经得到了大约 10k QPS 的限额

由于我现在需要在更大的集合上运行它,有没有一种方法可以在 Python 中完成?将数据分成 4 个 block 并将它们一起运行是否等同于并行处理代码?

也许我做错了,还有其他方法吗? - 我使用 Python 的经验主要用于分析和数据科学工作(numpy、pandas 等)- 所以这是我想到的唯一方法。

我使用的是配备 Intel xenon e5-2690 v2 处理器(20 核)和 128 GB RAM 的系统,所以我认为它应该能够处理这个问题,因为在我之前的执行中,它几乎没有出汗的资源利用。

如能为我指明正确的方向,我们将不胜感激。

编辑:所有的建议都将我指向 aiohttp,但是因为我时间不多了,而且我已经在多处理池方面取得了进展,所以我继续了。添加了几行额外的代码

if __name__=='__main__':

##read data

data_split = np.array_split(data,20)

p = Pool(20)
p.map(apicall, data_split)

apall”函数与上面的代码(for 循环部分)基本相同

对于大约 10,000 个数据集,它运行良好。但是,如果我将其扩展到 100,000 或更多,则会出现错误并再次卡住

OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

编辑2:明白为什么我会收到上述错误。看起来异步是唯一的出路。

最佳答案

aiohttp是你的工具。

async with aiohttp.ClientSession() as session:
async with session.post(url, data=json.dumps(payload), headers=headers) as resp:
resp = await resp.text()

关于python - 如何并行化包含后请求 API 调用的 python 中的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52307518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com