2014-07-10 37 views
1

這是迄今爲止我已經要求對SO最瘋狂的問題,但我打算給它一個鏡頭中獲得關於我是否感到了一些建議,希望能利用正確的工具和方法高效地處理大量數據。我沒有必要尋求優化我的代碼的幫助,除非我完全忽略了一些東西,但基本上只是想知道我是否應該使用不同的框架來代替Python。我已經足夠新到Python,不能完全確定是否有可能更高效地處理大量數據並存儲到數據庫中。本質上,下面的實現是讀取目錄中的文本文件,每個文本文件包含50K行JSON對象,需要先解析並讀取,然後在加載到數據庫之前轉換爲csv。我討厭使用列表容器,我希望有更多的東西可以在Python中以更好的方式實現。我最初的想法是,我應該使用發電機進行研究,但不完全確定。最後的瘋狂的concat部分很重要,因爲它將逗號分隔的列表轉換爲它自己的行。 Converting Column with string separated values into rows更有效的方式使用JSON解析和處理大文件對象

triggerZipFiles = glob.glob('*.zip') 
    for triggerFiles in triggerZipFiles: 
     with zipfile.ZipFile(triggerFiles, 'r') as myzip: 
      for logfile in myzip.namelist(): 
       datacc = [] 
       zipcc = [] 
       csvout = '{}_US.csv'.format(logfile[:-4]) 
       f = myzip.open(logfile) 
       contents = f.readlines() 
       for line in contents: 
        try: 
         parsed = json.loads(line[:-2]) 
         if "CC" in parsed['data']['weatherType'] and "US" in parsed['zipcodes']: 
          datacc.append(parsed['data']) 
          zipcc.append(parsed['zipcodes']) 
        except: 
         pass 
       if len(datacc) > 0: 
        df = pd.concat([pd.DataFrame(zipcc), pd.DataFrame(datacc)], axis=1) 
        df = pd.concat((pd.Series((v, row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key'], row['key'], row['key'], 
        row['key'], row['key'], row['key'], row['key']), df.columns) for _, 
         row in df.iterrows() for v in row['US']), axis=1).T     
        df.to_csv(csvout, header=None, index=False) 
       else: 
        pass 
       print datetime.now().strftime('%Y/%m/%d %H:%M:%S') + ": Finished: {}".format(logfile) 
+0

一個很容易修復的低效率的東西:a_dict.keys()中的測試'x首先創建一個包含所有鍵的列表和然後在該列表中進行_linear_搜索。直接在'dict'上測試遏制不會創建額外的列表並且具有恆定的運行時間。 我也將'if'語句與'和'結合成一個。 – BlackJack

+0

非常感謝。你能否提供一個小例子,直接在字典上測試遏制會是什麼樣子? – horatio1701d

+0

'key36/62/65'每個出現在那個奇怪的連續構造中兩次。那是故意的嗎? – pillmuncher

回答

2

首先,是不是一個特別有用的指標,當談到JSON!
其次,你有正確的想法:你一定要做到這一點塊基(讀取/清潔/單獨傾倒各部分)。

我建議使用熊貓read_json功能,它在創造DataFrames(它不創建一個臨時蟒蛇字典),看到reading in json section of the docs更加高效。

  • 如果沒有實際上 JSON,然後做字符串操作,使他們JSON通常是你最好的選擇。*
  • 如果你已經「奇怪形狀的」 JSON,那麼你就可以讀取時json_normalize ,或者在DataFrame中讀取之後解析包含多列的列(例如,使用串行字符串方法或應用)。

*目前還不清楚實際的格式是什麼,但往往並不需要很多,使他們成爲有效 JSON。

Python的獎金提示:如果你是更多的是一些縮進層次深的考慮除了分解成更多的功能。 (這裏明顯的選擇是使f1(logfile)f2(line),但使用描述性名稱......)