2011-01-05 20 views
1

我試圖找到將一些數據附加到使用Python的json文件的最佳方式。基本上發生了什麼是我有約100線程打開存儲數據到數組。完成後,使用json.dump將它發送到json文件。然而,由於這可能需要幾個小時才能建立起來,我最終會耗盡內存。所以我試圖看看在這個過程中使用最少量RAM的最佳方式是什麼。以下是我所需要的大量RAM。在Python中追加到JSON(最好是由於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') 

感謝

+0

'有效範圍內的(0,1)'空,用'null'不會被使用?這個是來做什麼的?還要注意'range(0,1)== range(1)'。 – EOL 2011-01-05 13:21:52

+0

你的'twitter_data'實質上等同於一個列表。爲什麼不用列表來代替?這肯定會消耗更少的內存。 – EOL 2011-01-05 13:27:17

回答

1

我採取的,建立在從格倫的回答這個想法,但序列化大字典由OP的要求,並使用更Python enumerate,而不是手動遞增i(誤差可以通過保持一個獨立的計數來考慮他們和來自i減去wriring到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("}") 
+0

非常感謝,爲了保持我留下的代碼基本相同的錯誤,我只做了兩個更正。 ('%s'%(json.dumps(dict(fu = self.ip,su = friends))))''以便它可以在Python中作爲正確的json文件打開,'j = j + 1'加上在該行後面跟蹤錯誤,同時在with語句中定義'j = 0' – eWizardII 2011-01-05 11:05:33

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") 
+0

+1,但是,'twitter_data'是一個字典而不是一個列表,儘管可以使用相同的概念(序列化生成器中的每個項目)。 – albertov 2011-01-05 09:40:32

+0

感謝您的幫助。 – eWizardII 2011-01-05 11:08:07