2017-10-15 9 views
0

最終的には1つのグローバルファイルを持つために、各ファイルに〜5メガバイトのファイルを解析して組み合わせることができます。多くのxmlファイルを解析して組み合わせるとメモリが不足します

現在、私はバンドルJMSSerializerBundleでそれをデシリアライズ各ファイルに対してスクリプト(symfonyフレームワークコマンド)

を実行するcronを使用、これは、XMLファイルからオブジェクトを作成することができます。

そして私にはメモリの問題があります。私はこれがこの非直列化によるものだと思う。

だから、私の質問は、

  • ありますが、私はSimpleXMLを持つ構文解析することにより、このバンドルに、この直列化復元を交換する場合、あなたはそれが少ないメモリを消費思います、このSTUPを行うには良い方法を知っていますか?

  • また、ファイルを変数に保存すると、Redisは何かを変更しますか?

  • 最後に、データベースを使用すると、ファイルをテーブルに保存した後、テーブル内のすべてのレコードを取得し、グローバルXMLファイルを作成します。いいアイデアですか? グローバルファイルをいくつかの手順で作成し(毎回3つのファイル)、毎回テーブルに保存し、毎回単純な配列でデータを取得します。

ありがとうございました。

+1

SimpleXMLでメモリに問題がある場合は、[XMLReader](http://www.php.net/manual/en/class.xmlreader.php)のようなプルパーサーを使用するように切り替えてください。 –

+0

XMLReaderとXMLWriterは、一度にファイル全体を構築できるようにすべきです。これは、平均してデータで行う必要がある処理の量に依存します。両方をパイプライン化することができます。 –

+0

ええ、私はXMLReaderのおかげでみんなを使うつもりです。 – sakados

答えて

0

コマンドラインで実行されるタスクの1つで、CLIスクリプトの最初にini_set('memory_limit', -1);を使用して、PHPのmemory_limit-1に設定することで回避できます。

これは明らかにリクエストのオプションではないため、1つのリクエストがシステムのすべてのメモリを浪費する可能性があります。また、利用可能なシステムメモリに依然として拘束されていることに注意してください。この問題は引き続き発生する可能性があります。

コメントで既に示唆したように、XMLReaderのようなプルパーサーを使用してメモリ使用量を減らすことができます。これは、XMLを読み込むことによって使用されるメモリの量を減らしますが、明らかに読み込まれたデータ(おそらく配列)を保持することは、まだ蓄積されます。最新のPHPバージョンを使用していない場合、おそらくメモリ使用量を最適化する最も簡単な方法です。

xhprofやblackfire.ioなどのツールを使用して、スクリプトのメモリ使用量をプロファイルし、それらが指摘する主な問題を解決することをお勧めします。

+0

ありがとうdbrumannこの説明のため:) – sakados

関連する問題