Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JSON数据发布请求,如何将其分解为块_Json_Python 3.x_Python Requests - Fatal编程技术网

使用JSON数据发布请求,如何将其分解为块

使用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':

我用这个脚本从一个表中发送许多(比如100000++)记录。有时会出现异常错误“java堆空间”。因此,我希望进行一些错误处理,并将数据负载分成更小的块,然后通过POST请求发送。我当前的脚本有时工作,但大多数情况下返回堆空间错误

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