1

我正在尝试找到使用 Python 将一些数据附加到 json 文件的最佳方法。基本上发生的事情是我有大约 100 个线程打开将数据存储到数组中。完成后,他们使用 json.dump 将其发送到 json 文件。然而,由于这可能需要几个小时才能建立阵列,我最终会用完 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 数组的简单示例,无需将全部内容保存在内存中;一次只需要存储数组中的一个元素。

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 的回答的想法,但按照 OP 的要求序列化一个大字典,并使用更多的 pythonicenumerate而不是手动递增(可以通过为它们保留一个单独的计数并在写入之前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 回答