1

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')

ありがとう

4

2 に答える 2

3

個々の項目を作成時に配列として出力し、配列の JSON 形式を手動で作成します。JSON は単純な形式なので、これを行うのは簡単です。

以下は、JSON 配列を出力する簡単な例です。内容全体をメモリに保持する必要はありません。一度に格納する必要があるのは、配列内の 1 つの要素だけです。

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")
于 2011-01-05T09:28:22.560 に答える
1

私の見解では、Glenn's answer のアイデアに基づいていますが、OP の要求に応じて大きな辞書をシリアル化enumerateし、手動でインクリメントするのではなく、より Pythonic を使用しています (エラーは、それらの個別のカウントを保持し、それを wriringする前にi減算することで考慮できます)。 ):if

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("}")
于 2011-01-05T09:57:01.450 に答える