PythonのJSONに追加されます(RAMの制約により最適に)
質問
Pythonを使用してJSONファイルにデータを追加する最適な方法を見つけようとしています。基本的に何が起こるかは、100個のスレッドが配列に保存されていると言うことについてです。それらが完了すると、json.dumpを使用してJSONファイルに送信します。ただし、アレイが蓄積するまでに数時間かかる可能性があるため、最終的にはRAMが不足しています。ですから、このプロセスで最小限のRAMを使用する最良の方法を見ようとしています。以下は、私が持っているものが多くのRAMに消費するものです。
i = 0
twitter_data = {}
for null in range(0,1):
while True:
try:
for friends in Cursor(api.followers_ids,screen_name=self.ip).items():
twitter_data[i] = {}
twitter_data[i]['fu'] = self.ip
twitter_data[i]['su'] = friends
i = i + 1
except tweepy.TweepError, e:
print "ERROR on " + str(self.ip) + " Reason: ", e
with open('C:/Twitter/errors.txt', mode='a') as a_file:
new_ii = "ERROR on " + str(self.ip) + " Reason: " + str(e) + "\n"
a_file.write(new_ii)
break
## Save data
with open('C:/Twitter/user_' + str(self.id) + '.json', mode='w') as f:
json.dump(twitter_data, f, indent=2, encoding='utf-8')
ありがとう
解決
グレンの答えからのアイデアに基づいているが、OPの要求に従って大きな口述をシリアル化し、より多くのPythonicを使用する私の考え enumerate
手動で増加する代わりに i
(エラーは、それらの個別のカウントを維持し、からそれを差し引くことで考慮することができます i
手紙を書く前に f
):
with open('C:/Twitter/user_' + str(self.id) + '.json', mode='w') as f:
f.write('{')
for i, friends in enumerate(Cursor(api.followers_ids,screen_name=self.ip).items()):
if i>0:
f.write(", ")
f.write("%s:%s" % (json.dumps(i), json.dumps(dict(fu=self.ip, su=friends))))
f.write("}")
他のヒント
個々のアイテムを作成したときに配列として出力し、その周りの配列のフォーマットを手動で作成します。 JSONは簡単な形式なので、これは些細なことです。
以下は、内容全体をメモリに保持することなく、JSONアレイを印刷する簡単な例です。配列内の単一の要素のみを一度に保存する必要があります。
def get_item():
return { "a": 5, "b": 10 }
def get_array():
results = []
yield "["
for x in xrange(5):
if x > 0:
yield ","
yield json.dumps(get_item())
yield "]"
if __name__ == "__main__":
for s in get_array():
sys.stdout.write(s)
sys.stdout.write("\n")
所属していません StackOverflow