web-dev-qa-db-ja.com

このXMLおよびデータ処理タスク用に選択するプログラミング言語は何ですか?

私は現在PHPでコーディングしています。最近私はPHPとSymfonyを使用してプロジェクトに取り組んでいます:

  1. 大きなXMLファイルを読み取る(多くのDOM解析/読み取り)、
  2. 大きなXMLファイルを大きな配列に変換し、
  3. 2つの大きな配列(多くの配列ソート)をマージします。
  4. 2つの大きな配列を取り、それらを大きなCSVファイルに変換します。

PHP=で終了しましたが、現在はメモリを大量に消費し、実行に約8〜15秒かかります。そのため、次のオプションがあり、いずれかを選択する手助けが必要です。

  1. PHPのより優れたメソッドを使用して、リライト/リファクタリングしてみてください
  2. 別のプログラミング言語を選択してください(私は1つの言語を学びたいと思っています。おそらく別の言語がこれらの処理をはるかに速く処理したいですか?)
  3. 1または2を実行し、常にxmlファイルを読み取り、MongoDBドキュメントに書き込むように設定して、データを廃棄する代わりにデータベースからクライアントにサービスを提供します。

これらの種類のタスクをより速く処理できる別の言語(Python、Cなど)があると確信しているので、私は2または3(異なる言語を使用)を実行する傾向があります。どちらかわからないだけです。

5
NoviceCoding

別の言語を選択する前に、最初にその言語がボトルネックであることを確認してください。それで、あなたは実際に4つのステップの時間を測定しましたか?たとえば、ステップ1のほとんどの待機時間が言語インタプリタで費やされていることを知っていますか(ディスクIOが原因ではありません)。後者の場合、C++(またはアセンブラー)のような言語を選択しても、関連する速度の向上が得られない場合があります。

多くの場合、XML処理はXMLパーサーの速度に依存しているため、次に検討する必要があるかもしれません。 libxml は非常に高速で、Cライブラリですが、PHP拡張機能として使用することもできます。大きな配列を構築するmay言語の変更、ソートによって高速化されますが、PHP(これはおそらくCまたはC++自体)そして、ファイルへのデータの書き込みは、ほとんどがディスクI/Oによって支配されます。これも、別の言語では役に立たないものです。

したがって、まず本当の問題がどこにあるかを確認してください。そうしないと、測定せずに最適化を行うと仮定すると、問題がどれほど間違っているかがわかります。

17
Doc Brown

XMLでの作業に推奨する言語は [〜#〜] xslt [〜#〜] で、この目的のために設計されています。 XMLファイルをマージし、CSVファイルを出力として生成するのに最適です。

XSLTはXSL Transformationsの略で、W3C(1999年以来のWorld Wide Web Consortiumの推奨事項です。XMLもW3C標準であり、XMLとXSLTの両方が関連する標準です。実際、XSLTは実際にはXMLなので、XMLを知っていれば、これは、XMLドキュメントで作業している場合におそらく行うことですが、XSLTプログラムの構造はすでに理解しています。

Firefox、IEおよびGoogle ChromeはすべてXSLTプロセッサを実装しています。さらにMicrosoft、AppleはXSLTプロセッサを実装し、ソースプロセッサをオープンしています Gnomeのツールキット なども存在します。

XSLTプロセッサーの実装は非常に多いため、主要ベンダーの製品は高度に最適化されており、速度でパフォーマンスが向上するXMLファイルで動作する代替実装を見つけることはほとんどありません。

ウィキペディアによると:

ただし、XSLTプロセッサは、式ツリーの静的な書き換え(ループから計算を移動するなど)や中間結果のメモリフットプリントを削減する遅延パイプライン評価など、関数型プログラミング言語やデータベースクエリ言語に見られる最適化手法をますます使用しています。 (プロセッサが以下の兄弟などの式を評価できる場合は、「早期終了」を許可します:: * 1 すべての部分式の完全な評価なしで)。多くのプロセッサーは、汎用のDOM実装よりも(空間と時間の両方で)非常に効率的なツリー表現も使用します。

これらの他の質問も確認したい場合があります: https://softwareengineering.stackexchange.com/questions/25202/what-is-the-reason-for-using-xslthttps://softwareengineering.stackexchange.com/questions/13477/xslt-for-beginners

5
JonnyBoats

誰もこれに言及していないことに驚いたが、XMLデータをDOMDocumentに読み取り/解析する代わりに、SAX処理を使用できる。つまり、XMLデータが読み取られて解析されている間、実行する追加した関数があります。たとえば、「root」という名前の要素の開始タグが発生すると、「root_start」などの関数が実行されます。

XMLパーサーライブラリ を使用すると、SAX処理メソッドを使用できます。 少数 が含まれます。

その後、XMLデータのDOMDocumentとしての保存をスキップして、言及した大きな配列としてデータを保存できます。次に、以前と同じようにマージ/ソートを続けます。これにより、メモリの消費量とタスクにかかる時間が短縮されます。

適切なソート/マージアルゴリズムも使用していることを確認してください。 XMLドキュメントの処理中に、並べ替えやマージを行う必要がある場合があります...

4
Rudolf Olah