最大データアップロード制限が1MBのサーバーに数十万のJSONレコードを投稿しています。私のレコードは、数百バイトから数十万バイトまで、非常にさまざまなサイズになる可能性があります。
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)
その後、サーバーに投稿します。現在は機能していますが、jsonified文字列へのtoSendの継続的なダンプは非常に重く、ほぼ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)