這是迄今爲止我已經要求對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)
一個很容易修復的低效率的東西:a_dict.keys()中的測試'x首先創建一個包含所有鍵的列表和然後在該列表中進行_linear_搜索。直接在'dict'上測試遏制不會創建額外的列表並且具有恆定的運行時間。 我也將'if'語句與'和'結合成一個。 – BlackJack
非常感謝。你能否提供一個小例子,直接在字典上測試遏制會是什麼樣子? – horatio1701d
'key36/62/65'每個出現在那個奇怪的連續構造中兩次。那是故意的嗎? – pillmuncher