2011-08-13 16 views
7

私のデータベースからJSONという形式でデータをエクスポートしましたが、これは基本的には1つの[list]であり、そこに{objects}の束(900K)があります。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 

(Iドン」を何かpg_restoreが何をしているのか知っていますが、エラーが出ます)

このチュートリアルでは、この情報を便利に残しています。ほとんどの状況でおそらく必要な-Uオプションです。はい、マニュアルページにこれについて説明していますが、気にしない50のオプションを選別するのは常に苦痛です。


私はケニーの提案に行くことになった...それはまだ大きな痛みだった。テーブルをファイルにダンプし、圧縮し、アップロードし、抽出した後、インポートしようとしましたが、データは生産上わずかに異なり、外部キーが不足していました(郵便番号が都市に付いています)。もちろん、私は新しい都市をインポートすることはできませんでした。なぜなら、それを静かに無視するのではなく、重複したキーエラーが発生するからです。だから私はそのテーブルを空にして、都市のためのプロセスを繰り返し、他に何かが都市に縛られていることを認識するだけで、私はそのテーブルも空にしなければならなかった。都市を戻してから、ついに郵便番号をインポートすることができました。今はすべてがすべてに結びついていて、すべてのエントリを再作成しなければならなかったので、データベースの半分を削除しました。美しい。私はまだサイトを立ち上げていない良いこと。また、テーブルを空にしたり、テーブルを切り捨てても、シーケンス/自動インクリメントはリセットされていないようですが、私はID 1を持っているカップルの魔法のエントリがあるので、それを削除したりリセットしなければなりませんそれらはあまりにも(私は)わからないので、私は手作業で1のそれらのためのPKsを編集しました。

私はphihagのソリューションで同様の問題に遭遇していたでしょう、エクスポートスクリプトと一致する別のインポートスクリプトを書いていない限り、彼は文字通り私の質問に答えましたが、とても感謝しています。 Pythonで

答えて

1

あなたと仮定すると、戻ってもう一度データをエクスポートするためのオプションを持っています...:

pg_dump - PostgreSQLデータベースをスクリプトファイルまたは他のアーカイブファイルに抽出します。

pg_restore - pg_dumpによって作成されたアーカイブファイルからPostgreSQLデータベースを復元します。

これは役に立たない場合は、別の提案がマークに当たるように、出力で何をしているのかを知ることは有益かもしれません。

+0

pg_dumpはうまくいくはずですが、復元がチャンク内になければ余りにも多くのリソースを消費する可能性があります。私が出力でやっているのは、それを私のプロダクションサーバーにインポートすることだけです。 – mpen

+0

私は今、領域を推測することになっていますが、私はJSONメソッドのリソース利用率がJSON解析と関係していると思っていたでしょう。しかし、私が言うように、それは_total_推測です。私はpg_dumpとpg_restoreメソッドを使って何が起こったのかを見ています(もちろんリソースを見ている間); – Kenny

+0

これはそうです(これまではPostgresを使っていないことが分かりました):--data-only スキーマ(データ定義)ではなくデータのみをダンプします。 – Kenny

7

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を取得しています。「strの」オブジェクトは、「と」の行に'「__ __exit」は属性を持っていません。 Nvm、それを考え出した。どうもありがとう! – mpen

+0

@マークoops、 'open'を忘れました。一定。 – phihag

2

私も下にコピーされたtiny script (gist)

にphihagさんとマークの仕事を回し:私はこれが問題である知っている

#!/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

はしばらく前からですが、私はこの新しいソリューションは、手間のかからないと思います。

chunkksizeパラメータをread_jsonの一部としてサポートするpandas 0.21.0を使用できます。一度に1つのチャンクをロードし、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)) 
関連する問題