使用JSON数据发布请求,如何将其分解为块
我用这个脚本从一个表中发送许多(比如100000++)记录。有时会出现异常错误“java堆空间”。因此,我希望进行一些错误处理,并将数据负载分成更小的块,然后通过POST请求发送。我当前的脚本有时工作,但大多数情况下返回堆空间错误使用JSON数据发布请求,如何将其分解为块,json,python-3.x,python-requests,Json,Python 3.x,Python Requests,我用这个脚本从一个表中发送许多(比如100000++)记录。有时会出现异常错误“java堆空间”。因此,我希望进行一些错误处理,并将数据负载分成更小的块,然后通过POST请求发送。我当前的脚本有时工作,但大多数情况下返回堆空间错误 import json import requests from multiprocessing import Pool url = "some url" header = {"Content-Type": "application/json", 'Accept':
import json
import requests
from multiprocessing import Pool
url = "some url"
header = {"Content-Type": "application/json", 'Accept':'application/json'}
api_key="some key"
def send_request(data):
try:
res = requests.post(url, headers=header, json={"api_key": api_key, "attributes": data})
print(res.status_code)
print(res.json())
except requests.exceptions.RequestException as e:
#catastrophic error. bail.
print(e)
def chunks(data):
for i in range(0, len(data), 50):
yield data[i:i + 50]
p = Pool(8)
p.map(send_request, chunks(json.loads(data)))
从
多处理
:
映射(func,iterable[,chunksize])
请注意,它可能会导致很长一段时间的iterables内存使用率很高。考虑使用<强> IMAP()或强>或>强> IMAPUnOrdEdEd()<强>显式块大小
提高效率的选择
(增加重点)
然后:
imap(func,iterable[,chunksize])
map()的更懒惰版本
chunksize参数与map()使用的参数相同
方法。对于很长的iterables,使用大的chunksize值可以
使作业完成速度比使用默认值1快得多
那有多好<代码>imap为您执行分块,因此您不必担心生成自己的函数
那么,让我们来测试一下
from multiprocessing import Pool
from datetime import datetime
import sys
testObj = [{ "data": list(range(5000)) }] * 250000
def doFunc(data):
# arbitrary test function, take square root of all numbers
for item in data:
for num in item['data']:
num ** 0.5
def chunks(data):
for i in range(0, len(data), 50):
yield data[i:i + 50]
p = Pool(8)
start = datetime.now()
mapTest = p.map(doFunc, chunks(testObj))
print("map took ", datetime.now() - start)
print("sizeof map: ", sys.getsizeof(mapTest))
start = datetime.now()
imapTest = p.imap(doFunc, testObj, 50)
print("imap took ", datetime.now() - start)
print("sizeof imap: ", sys.getsizeof(imapTest))
start = datetime.now()
imapOTest = p.imap_unordered(doFunc, testObj, 50)
print("imap_unordered took ", datetime.now() - start)
print("sizeof imap_unordered: ", sys.getsizeof(imapOTest))
结果(平均50次迭代):
这将是26.6秒,而不是0.001秒。但更重要的是,对于您正在寻找的内容,请查看节省的内存!在这个非常不科学的测试中,结果非常显著
由于POST请求不能像平方根计算那样加快速度,因此您不会看到完全相同的时间节省,但希望切换到
imap
会对您有很大帮助,尤其是在内存方面。您能添加对遇到错误的回溯吗?
map took 0:00:26.61296
sizeof map: 40072
imap took 0:00:00.00106
sizeof imap: 128
imap_unordered took 0:00:00.00108
sizeof imap_unordered: 128