2012-03-27 10 views
0

私はこのようになり、大規模なXMLファイルを持って削除します。私は、それぞれが1 LogMessageにを含む、複数のファイルに分割したい、と私はいずれかを保存しない無効なデータと分割XML

 20120124 07:30:15.301, saving to queue 
<logmessage> 
    <logline1>some data</logline1> 
    <logline2>some data too</logline2> 
</logmessage> 

    20120124 07:30:15.302, processing message 
<logmessage> 
    <logline1>some data</logline1> 
    <logline2>some data too</logline2> 
</logmessage> 

をルートノード外のデータこれどうやってするの?

答えて

0

お望みのものに注意してください。あなたがしていることの結果を考えてください。これが非常に大きなXMLファイルである場合は、ディレクトリに非常に多くの小さなファイルが作成されます。それは多くの点で悪いことがあります。それぞれのファイルシステムは、少なくとも現在の大規模なファイルシステムでは最大のブロックサイズを占めることになります。それぞれは、有限のリソースであるlinux上のinodeを取るでしょう。十分な空きがあるかどうかを判断するためにdf -iを使います。最後に、同じディレクトリに作成されるファイルが多すぎると、一部のファイルシステムに制限があります。

次のように作成されるファイルの数を教えてくれます:

perl -e '$/="</logmessage>";while(<>) {$i++};print $i,"\n"' log.xml 

以下は、.xml拡張子を持つファイル名に日付と時刻を使用して新しいファイルを作成します。複数のメッセージが同じタイムスタンプを持つ場合、メッセージは追加されます。

perl -e '$/="</logmessage>";while(<>) {m{([\d:\. ]+)};open(fh,">>","$1.xml");s{^.*?(?=<logmessage>)}{}sm;print fh $_,"\n";close fh}' log.xml 

はまた、多くのXMLライブラリが非常に大きいXMLファイルの問題となる可能性がメモリ内の完全なファイルを開こうとしますので注意してください。この手順では、メモリ内のファイル全体を開こうとしません。ファイルが大きすぎてメモリに収まらない場合は、SAXやストリーミングではないXMLパーサーを使用するソリューションは使用できません。 DOMパーサーを使用するには、文書サイズとオーバーヘッドの倍数を掛けたメモリを必要とします。

0

"大きな" XMLファイルを処理する助けを求めるのは、ブリッジが "ワイド"な川を渡るように設計するのを助けてほしいと言っているようなものです。私は人々に "どのくらいの大きさ?"と尋ねると、10Mbから100Gbの回答を得ました。違いがあります。

あなたの疑問にはっきりしないもう一つのことは、整形式XMLを扱っているかどうかです。あなたはそれがXMLだと言いますが、無効なデータについても言及します。正しく構成されたXMLを処理するソリューションは、XMLではないデータを処理するソリューションと大きく異なる可能性があります。

関連する問題