XML のようなものよりも固定幅のファイル形式に利点はありますか? XML は、同じ量のデータを保存するために、より多くのディスク領域を占有する可能性が高いことを認識していますが、ファイルも圧縮される可能性があります。理論的には、ファイル内の場所に基づいて特定のデータを読み取ることもできると思います (それらのバイトを取得するだけです)。しかし、それ以外に、他に何がありますか?
6 に答える
データが大きい場合 (ギガ/テラバイト)、固定幅形式のファイルの方がはるかに効率的です。
各レコードとフィールドのサイズは固定されているため、(たとえば) n-100 万行をシークして、そこからいくつかのレコードを読み取ることができます。ファイル全体をメモリにメモリマップして、すべてに効率的かつ簡単にランダムアクセスすることもできます。
このような場合、XML ファイルは適していません。
XMLは複雑です。特に、スキーマに従って検証を行う場合。他の誰かがあなたが使用できるXMLパーサーをすでに書いているので、これは重要に見えないかもしれません。ただし、これによりかなり多くの処理が追加されるため、時間がかかります。多くの場合、これは問題ではないかもしれませんが、問題になることもあります。
1つの整数をカスタムファイル形式に保存する場合は、4バイトしかかかりません。ロードする場合は、それらの4バイトをメモリにコピーするだけです(ファイル形式とプラットフォームのエンディアンが同じであると想定)。ただし、XMLの場合、10〜30バイトかかる場合があります。そして、それをロードするということは、文字列を比較し、整数などの10進表現を解析することを意味します。
繰り返しになりますが、これらのパフォーマンスとストレージサイズの違いは、検討することすらできないほど小さい場合があります(また、カスタム形式を考案するために必要な作業は重要です)が、多くの場合、これらの違いは重要です。
たとえば、一部のデータの送信にSMSメッセージを使用するシステムに遭遇しました。つまり、メッセージごとに140バイト(!)があります。また、これらのメッセージを送受信するデバイスには、GBのメモリとGHzのCPUがありません。そのような状況では、すべてのビットが重要であり、XMLを使用しないようにします。
固定幅の威力に気付くまで、私も同じ疑問を抱いていました。JSONがファイルサイズを15GBと2時間以上に膨らませたため、それらをファイルに抽出する何百万ものレコードを含むテーブルがあります。固定幅を使用している間、6.5GB と 15 分に減少しました。
固定幅の抽出と書き込みは、JSON よりも高速です。
私もCSVを試してみましたが、ここでも固定幅の方がスコアが高かったです。
XML、JSON (など) のパーサーはほとんどすべてのプラットフォームに存在するため、おそらく主に従来の理由によるものです。
あなたが示唆しているように、理論的には固定幅形式の方がスペース効率が高くなる可能性があります。そして読み方は少し簡単です。しかし、これらは重要な利点のようには見えません。
価値があるのは、CSV のような表形式 (ただし固定幅ではない) 形式には用途があり、よりコンパクトな表現とおそらくより優れた読みやすさを組み合わせることです。CSV は、map/reduce スタイルのジョブで非常にうまく機能します。
理由の 1 つは、XML の処理 (メモリ構造への読み込みと読み込みだけでなく、単純な固定幅または区切りファイルに対する XML ファイルの正規表現検索、または不適切なデータを手動で迅速に修正することについて考えてみてください) がより多くのことである可能性があります。固定幅ファイルよりも複雑です。確かに、現在、それを実行できるライブラリは多数ありますが、現在取り組んでいるプラットフォーム用のライブラリがない場合、XML パーサーや特定の場所でnバイトを読み取るだけのプログラムを本当に作成したいですか? ×?