2012-04-27 14 views
3

MySQLへの80GBのXMLデータのインポートに5日以上かかることがありますか?XMLファイルからMySQLへのパフォーマンス一括ロード

XMLファイルのサイズが約80GBで、私が使用しているコードはgistで、すべて正常に動作していますが、ほぼ5日間連続して実行されています。 ...行って

平均テーブルサイズはおおよそ次のとおりです。

Data size: 4.5GB 
Index size: 3.2GB 
Avg. Row Length: 245 
Number Rows: 20,000,000 

は、より多くの情報が必要な場合、私に教えてください!

サーバー仕様: - クアッドコア - 2.27GHZ 合計4GBのRAM

XMLサンプル

https://gist.github.com/2510267

注これはLinodeのは

のIntel XeonプロセッサL5520をVPSでありますありがとう!


これが平均のようです。この問題に関する詳細調査した結果、私は輸入率を改善する方法を説明し、このanswerを見つけました。

+2

コードのプロファイリングを試して、時間の所在を確認しましたか? – eggyal

+0

トランザクションログを変更して、問題が発生しないようにすることができます。http://stackoverflow.com/questions/996403/disable-transaction-log –

+1

小さなテストでコードを試して、正常に動作することを確認しましたか? ? –

答えて

2

大いに役立つ1つのことは、1行につき1回ではなく、あまり頻繁にコミットすることではありません。私は、数百行ごとに1つのコミットを開始し、そこからチューニングすることをお勧めします。

また、存在チェックを行う場所で今行っていることをダンプします。実行する必要があるクエリの数が大幅に増えています。その代わりに、(標準に準拠していないMySQLの拡張機能)を使用して、INSERTの複製を自動的に正しいものにします。

最後に、XMLからmysqlimportツールでの使用に適したテキスト形式に変換し、代わりにそのバルクローダを使用するツールを構築することを検討してください。これにより、XML解析に必要な時間がデータベースの処理に必要な時間から完全に分離され、目的のために設計されたツール(INSERTまたはUPDATEコマンドではなく、mysqlimportでは特殊なLOAD DATA INFILE拡張が使用されます)

+0

ああ、バグ、ありがとう!存在チェックは、ツールの最新のアップデートから間違って削除されたインポートのタイプに基づいて除外されるべきです。私はmysqlimportツールも見ていきます。 – Nick

+0

バグが見つかってパフォーマンスを改善するためのヒントを提供して以来、これを受け入れるとマークしています:) – Nick

0

これは(おそらく)スピードの問題とは無関係ですが、iterparseの動作があなたのロジックに合っているかどうかを確認することをお勧めします。開始イベントが発生すると、ノードのテキスト値がロードされているかどうか(それが解析されたデータの塊に収まるかどうかによって異なります)、むしろランダムな動作を得ることができます。

0

私は

  1. は、高性能のためにコードを最適化似何かをしようとした後、あなたのコードを見ずに作るために3迅速suggesstionsを持ってHigh-performance XML parsing in Python with lxml を見て素晴らしい記事です。
  2. pypy
  3. に見ては、Pythonが大幅にこれらの事をやってネイティブに

を行うことはありません複数のCPUを利用するようにコードを書き換える

  • 私が働いていた同様のプロジェクトの速度を改善しました。 おそらく、いくつかのコードとexample xmlを投稿していれば、もっと深い解決策を提供できるでしょう。

  • +0

    コードは、質問の2番目の文でリンクを参照した要点に掲載されています。私はすでに記事#1を読んでおり、システムはmysql/pythonの負荷を均等に均等に分配しているクアッドコアで実行されていますので、複数のコアが本当に役立つように書き直すでしょうか? – Nick

    +0

    はい、私の謝罪私は要点を見ていきます。 – matchew

    関連する問題