4

現在、LIBXML :: SAXParser :: Callbacksを使用して、140,000個の製品のデータを含む大きなXMLファイルを解析しています。タスクを使用して、これらの製品のデータをRailsアプリにインポートしています。

前回のインポートが完了するまでに10時間弱かかりました。

rake asi:import_products --trace  26815.23s user 1393.03s system 80% cpu 9:47:34.09 total

現在の実装の問題は、XMLの複雑な依存関係構造が意味することです。つまり、製品ノード全体を追跡して、適切に解析する方法を知る必要があります。

理想的には、各製品ノードを単独で処理し、XPATHを使用できるようにする方法が必要です。ファイルサイズにより、XMLファイル全体をメモリにロードする必要があるメソッドを使用できなくなります。元のXMLの形式やサイズを制御できません。プロセスで使用できるメモリは最大で3GBです。

これより良い方法はありますか?

現在のレーキタスクコード:

XMLファイルの抜粋:

4

1 に答える 1

1

最初にファイル全体を取得できますか? もしそうなら、XML ファイルをより小さなチャンク (たとえば 512MB 程度) に分割することをお勧めします。これにより、最新の CPU を使用していると思われるため、一度に (コアごとに 1 つ) 同時にチャンクを解析できるようになります。無効または不正な形式の xml について - 欠落している XML を単純な文字列操作で追加または先頭に追加するだけです。

コールバック メソッドのプロファイリングを試すこともできます。これはコードの大きな塊です。数分節約できるボトルネックが少なくとも 1 つはあるはずです。

于 2010-05-18T19:25:49.850 に答える