Python:限制用于发布到服务器的 json 字符串的大小

标签 python json post

我将数十万条 JSON 记录发布到最大数据上传限制为 1MB 的服务器。我的记录大小可变,从几百字节到几十万字节不等。

def checkSize(payload):
    return len(payload) >= bytesPerMB 


toSend = []
for row in rows:
    toSend.append(row)
    postData = json.dumps(toSend)
    tooBig = tooBig or checkSize()
    if tooBig:
          sendToServer(postData)

然后发布到服务器。它目前有效,但 toSend 不断转储到一个 jsonified 字符串似乎真的很重,几乎 100% 太多了,尽管我似乎找不到另一种方法。我可以将各个新记录进行字符串化并记录它们在一起的数量吗?

我确信一定有更简洁的方法来执行此操作,但我只是不知道。

感谢您提供的所有帮助。


这是我现在正在使用的答案,我与下面的@rsegal 同时想出了它,只是为了清晰和完成而发布(sendToServer 只是一个虚拟函数,用于显示一切正常工作),

import pickle
import json

f = open("userProfiles")
rows = pickle.load(f)
f.close()

bytesPerMB = 1024 * 1024
comma = ","
appendSize = len(comma)

def sendToServer(obj):
    #send to server
    pass

def checkSize(numBytes):
    return numBytes >= bytesPerMB

def jsonDump(obj):
    return json.dumps(obj, separators=(comma, ":"))

leftover = []
numRows = len(rows)
rowsSent = 0

while len(rows) > 0:
    toSend = leftover[:]
    toSendSize = len( jsonDump(toSend) )
    leftover = []
    first = len(toSend) == 0

    while True:
        try:
            row = rows.pop()
        except IndexError:
            break

        rowSize = len( jsonDump(row) ) + (0 if first else appendSize)
        first = False

        if checkSize(toSendSize + rowSize):
            leftover.append(row)
            break

        toSend.append(row)
        toSendSize += rowSize

    rowsSent += len(toSend)
    postData = jsonDump(toSend)
    print "assuming to send '{0}' bytes, actual size '{1}'. rows sent {2}, total {3}".format(toSendSize, len(postData), rowsSent, numRows)
    sendToServer(postData)

最佳答案

我会做类似下面的事情:

toSend = []
toSendLength = 0
for row in rows:
    tentativeLength = len(json.dumps(row))
    if tentativeLength > bytesPerMB:
        parsingBehavior // do something about lolhuge files
    elif toSendLength + tentativeLength > bytesPerMB: // it would be too large
        sendToServer(json.dumps(toSend)) // don\'t exceed limit; send now
        toSend = [row] // refresh for next round - and we know it fits!
        toSendLength = tentativeLength
    else: // otherwise, it wont be too long, so add it in
        toSend.append(row)
        toSendLength += tentative
sentToServer(json.dumps(toSend)) // if it finishes below the limit

您的解决方案的问题在于,从 Big-O 的角度来看,它并不是很好。我的以线性时间运行,你的将以二次时间运行,因为你要检查每个循环的累积长度。每次都重置 postData 也不是很有效。

关于Python:限制用于发布到服务器的 json 字符串的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11938433/

相关文章:

python - 正则表达式并使用 python 替换字符串

php - 使用 .htaccess RewriteRule 时,POST 值似乎会丢失。 GET 值没问题。怎么修?

php - 在php中的div内发布输入框值

来自 print(print(print ('aaa' ))) 的 Python 输出

python - Pandas 连接上一个当前文本和下一个文本

python - 如何控制for循环层数?

sql - 在SQL Server 2012列中查询JSON

arrays - 解码具有嵌套异构子对象的对象数组

java - 将大型 JSON 对象存储到 java 文件中?

asp.net - 使用 ASP.NET Web API 到多对多关系的 HTTP POST