内存管理:打开vs字符串构建

时间:2014-01-09 05:08:35

标签: python python-2.7

我已经从API中删除了超过300万条推文。我有一些处理推文的代码,然后我想将它们序列化为JSON并将它们写入文件。因为它有很多东西,所以我遇到了一些内存问题。我打算使用itertools.imap,但我的函数选项基本上都是

def string_builder(self, thing):
    self.output_string += json.dumps(thing)+"\n"
...
def parse_writer(self, dest):
    itertools.imap(self.string_builder, *iterator that processes the tweets and returns serializable output*)
    with open(dest) as f:
        f.write(self.output_string)

def write_wrapper(self, thing, dest):
    with open(dest, "a") as f:
        f.write(json.dumps(thing)+"\n")
...
def parse_writer(self, dest):
    itertools.imap(self.write_wrapper, *iterator that processes the tweets and returns serializable output*)

(我猜也有选择让文件对象保持打开然后重复写入。)

我知道构建字符串然后写一次通常是正确的事情。我想知道当问题的字符串如此之大时是否仍然存在。我试图尽可能地减少我的内存占用,因为我的资源基本上已经达到极限了。

1 个答案:

答案 0 :(得分:2)

不,在内存中构建文件并一次性写入并不是我知道的任何最佳实践指南:)它基本上无法实现任何低级缓冲的目的并遇到您面临的确切问题

最好的办法是逐行写入,即流式传输。

with open(dest, "a") as file:
    for tweet in iterator_that_returns_tweets:
        file.write(json.dumps(tweet) + "\n")