2011-08-13 33 views
7

我以JSON的形式從我的數據庫中導出了一些數據,它基本上只有1個[list],其中有一大堆(900K)的{objects}。將95MB的JSON數組拆分成更小的塊?

試圖將其導入到我的生產服務器上,但我有一些便宜的Web服務器。當我吃完所有資源10分鐘時,他們不喜歡它。

如何將此文件分割成更小的塊,以便我可以逐塊導入它?


編輯:其實,這是一個PostgreSQL數據庫。我接受其他關於如何以塊的形式導出所有數據的建議。我已經在我的服務器上安裝了phpPgAdmin,該服務器據說可以接受CSV,標籤和XML格式。


我不得不修復phihag的腳本:

import json 
with open('fixtures/PostalCodes.json','r') as infile: 
    o = json.load(infile) 
    chunkSize = 50000 
    for i in xrange(0, len(o), chunkSize): 
    with open('fixtures/postalcodes_' + ('%02d' % (i//chunkSize)) + '.json','w') as outfile: 
     json.dump(o[i:i+chunkSize], outfile) 

轉儲:

pg_dump -U username -t table database > filename 

恢復:

psql -U username < filename 

(我不不知道pg_restore做了什麼,但它給了我錯誤)

關於這方面的教程很方便地將這些信息留下,特別是,在大多數情況下可能需要的-U選項。是的,手冊頁解釋了這一點,但篩選50個你不關心的選項總是很痛苦。


我結束了肯尼的建議......雖然它仍然是一個主要的痛苦。我不得不將錶轉儲到一個文件,壓縮它,上傳它,提取它,然後我嘗試導入它,但生產中的數據稍有不同,並且有一些丟失的外鍵(郵政編碼附加到城市)。當然,我不能僅僅導入新的城市,因爲那樣會拋出重複的關鍵錯誤,而不是默默地忽略它,這本來就不錯。所以我必須清空那張桌子,重複城市的過程,只有意識到別的東西與城市有關,所以我必須清空那張桌子。重新獲得城市,最後我可以導入我的郵政編碼。到目前爲止,我已經刪除了一半數據庫,因爲一切都與所有條目相關,並且我必須重新創建所有條目。可愛。好東西,我還沒有啓動該網站。也「清空」或截斷表似乎並沒有重置序列/自動增量,我想,因爲有一些神奇的條目,我想有ID 1.所以...我必須刪除或重置那些也(我不知道如何),所以我手動編輯爲那些回到1的PK。

我會遇到類似的問題與phihag的解決方案,再加上我不得不導入17文件一個時間,除非我編寫另一個導入腳本來匹配導出腳本。儘管他的確從字面上回答了我的問題,但謝謝。

回答

1

假設你要回去,並再次導出數據的選項...:

pg_dump - 將PostgreSQL數據庫提取到腳本文件或其他存檔文件中。

pg_restore - 從pg_dump創建的存檔文件恢復PostgreSQL數據庫。

如果這沒有用,那麼知道你將如何處理輸出可能是有用的,這樣另一個建議可以達到標記。

+0

pg_dump會很好....但是如果不在區塊中,還原可能會消耗太多的資源。我所做的所有輸出都是在我的生產服務器上導入的。 – mpen

+0

我現在正在猜測領土,但我會認爲JSON方法中的高資源利用率將與JSON解析有關。但正如我所說,這是一個總的猜測。我會嘗試使用pg_dump和pg_restore方法來查看發生了什麼(當然在看資源的時候)) – Kenny

+0

看起來是這樣的(現在可能很明顯我以前沒有使用過Postgres): - 僅限數據 只轉儲數據,而不是模式(數據定義)。 – Kenny

7

在Python:

import json 
with open('file.json') as infile: 
    o = json.load(infile) 
    chunkSize = 1000 
    for i in xrange(0, len(o), chunkSize): 
    with open('file_' + str(i//chunkSize) + '.json', 'w') as outfile: 
     json.dump(o[i:i+chunkSize], outfile) 
+0

我得到'AttributeError的:「海峽」對象有沒有屬性「__exit __」'對「與」行。 Nvm,算出來了。非常感謝! – mpen

+0

@Mark oops,忘記了「open」。固定。 – phihag

2

我轉身phihag的和標誌的工作爲tiny script (gist)

也低於複製:

#!/usr/bin/env python 
# based on http://stackoverflow.com/questions/7052947/split-95mb-json-array-into-smaller-chunks 
# usage: python json-split filename.json 
# produces multiple filename_0.json of 1.49 MB size 

import json 
import sys 

with open(sys.argv[1],'r') as infile: 
    o = json.load(infile) 
    chunkSize = 4550 
    for i in xrange(0, len(o), chunkSize): 
     with open(sys.argv[1] + '_' + str(i//chunkSize) + '.json', 'w') as outfile: 
      json.dump(o[i:i+chunkSize], outfile) 
1

我知道這是問題是從一段時間回來,但我認爲這種新的解決方案是無障礙的。

您可以使用支持chunksize參數的pandas 0.21.0作爲read_json的一部分。您可以一次裝載一個塊並保存JSON:

import pandas as pd 
chunks = pd.read_json('file.json', lines=True, chunksize = 20) 
for i, c in enumerate(chunks): 
    c.to_json('chunk_{}.json'.format(i))