8

データベースからJSONの形式でデータをエクスポートしました。これは、基本的に1つの[リスト]であり、その中に{objects}の束(900K)が含まれています。

今、本番サーバーにインポートしようとしていますが、安価なWebサーバーがあります。私が彼らのすべての資源を10分間食べるとき、彼らはそれを好きではありません。

このファイルを小さなチャンクに分割して、1つずつインポートできるようにするにはどうすればよいですか?


編集:実際には、それは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状況でおそらく必要なオプション。はい、manページでこれを説明していますが、気にしない50のオプションをふるいにかけるのは常に苦痛です。


私はケニーの提案に行き着きました...それはまだ大きな苦痛でしたが。テーブルをファイルにダンプし、圧縮し、アップロードし、抽出してからインポートしようとしましたが、本番環境ではデータがわずかに異なり、外部キーが欠落していました(郵便番号は都市に添付されています)。もちろん、新しい都市をインポートすることはできませんでした。それは、それを黙って無視するのではなく、重複したキーエラーをスローするためです。それで、私はそのテーブルを空にし、都市に対して同じプロセスを繰り返さなければなりませんでしたが、何か他のものが都市に結びついていることに気づいたので、私もそのテーブルを空にしなければなりませんでした。都市を取り戻した後、ようやく郵便番号をインポートできるようになりました。すべてがすべてに関連付けられており、すべてのエントリを再作成する必要があったため、これまでにデータベースの半分を消去しました。素晴らしい。私が持っていない良いこと tはまだサイトを立ち上げました。また、テーブルを「空にする」または切り捨てても、シーケンス/自動インクリメントがリセットされないようです。これは、ID 1にしたい魔法のエントリがいくつかあるためです。したがって、削除またはリセットする必要があります。それらも(方法がわかりません)、手動で編集して1に戻しました。

phihagのソリューションでも同様の問題が発生しました。さらに、エクスポートスクリプトと一致する別のインポートスクリプトを作成しない限り、一度に17個のファイルをインポートする必要がありました。彼は私の質問に文字通り答えましたが、ありがとう。

4

4 に答える 4

10

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)
于 2011-08-13T20:14:33.797 に答える
2

ファイハグとマークの作品を小さな台本に変えました(要点)

以下にもコピー:

#!/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)
于 2014-11-18T11:48:29.130 に答える
1

戻ってデータを再度エクスポートするオプションがあると仮定します...:

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

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

それが役に立たない場合は、別の提案が的を射ているように、出力で何をしようとしているのかを知ることが役立つ場合があります。

于 2011-08-13T20:14:56.470 に答える
1

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

pandas 0.21.0の一部としてchunksizeパラメーターをサポートするwhichを使用できますread_json。一度に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))
于 2017-11-29T20:43:42.840 に答える