質問

私は現在、他のプログラマがどのようにデータをファイルに編成しているかに非常に興味があります。ファイル構造を作成するためのベスト プラクティスに関する優れた記事や書籍を誰かお勧めできますか?

たとえば、何らかの目的で独自のソフトウェアを作成した場合、保存したデータをプレーン テキストとして残し、シリアライズし、xml にエンコードしますか。なぜこのようなことを行うのでしょうか。

私が見逃している秘密はありますか?

役に立ちましたか?

解決

一般に、少なくとも最初は動作する可能性のある最も単純なものを使用します。たとえば、ほとんどの構成ファイルが空白で区切られたフィールド、または別の文字で区切られたフィールド(GCOSフィールドに空白を含めることができる":quot;区切り文字を使用する/ etc / passwdなど)だけであるUNIXを考えます。

データにさらに多くの構造が必要な場合は、「どのツールを簡単に使用できますか?」たとえば、PythonとRubyにはJSONとYAMLがあります。

XMLは、多くのXMLベースのものがすでにある場合、またはXMLをブラウザーで表示可能なフォームに変換することを期待している場合、基本的に便利です。それ以外の場合は、通常、それから得られるものに対して非常に重い(コードサイズ、複雑さ)です。

他のヒント

どの形式を選択した場合でも、何らかのバージョン番号を内部に保存することを忘れないでください(いくつかの変更を導入する必要があると確信しています)。

形式は、アプリケーションとデータの量に大きく依存します。一部のアプリケーションではXMLが適切であり、他のアプリケーションではバイナリファイルに格納されている固定サイズの構造体が適しています。

たとえば、状況に応じてさまざまな形式を使用しています。

  • MatlabおよびR分析用のデータセットを保存するためのプレーンテキストファイル(区切り)
  • バイナリファイル-固定サイズの構造を格納するため(動的サイズでは、要素のオフセットの個別の配列を維持しないとランダムアクセスが難しくなります)。パフォーマンスとスペース効率の良い点の1つ(ほとんどのデータベースはバイナリ形式でデータを保存するのはなぜですか?)が、人間にとってはあまり良くありません。エンディアンを忘れないでください。
  • XML-通常、構成データ、または(XSDと共に)他のユーザーアプリケーションに提供するデータ用。反対側は、素敵なXSLT変換を記述したり、他の方法でデータを消費したりすることができます(もちろん、形式の説明が与えられているプレーンテキストまたはバイナリデータでも同じことができます)

独自の要件がない限り、すでに成熟したライブラリが存在するものを使用すると、独自の解析コードを作成する必要がなくなります。それは、人々が言っ​​ているように、XML/JSON などを意味します。

もう 1 つの優れた機能は、Google のプロトコル バッファです (http://code.google.com/p/protobuf)。そこで共通のメッセージ定義を記述すると、プロトコル バッファー コンパイラーがデータの入力、シリアル化、および逆シリアル化を行うためのオブジェクトを生成します。通常、形式はバイナリですが、TextFormat クラスを使用して JSON のようなプレーン テキストを記述することもできます。protobufs の優れた点は、バージョン管理コードが生成されることです。ファイル形式のバージョン 2 では、フィールドを .proto 定義ファイルに追加するだけです。新しいバージョンは古いファイル形式を読み取ることができ、新しいフィールドを空白のままにするだけです。これは、protobuf が設計されたものと正確には異なりますが、カスタム メッセージ用の簡単で効率的なバイナリ ファイル形式を作成し、コードが生成されます。

Facebookもご覧ください 倹約, 、現在は Apache インキュベータ内にあります。

年月が経つにつれて、私はテキストが単に問題の外にない限り、ますますテキストを好むことに気づきました。 CPUは十分に高速であるため、十分に高速にデコードできます。

明らかに、大きなファイル内の小さな情報を頻繁に更新する必要がある場合、これはオプションではありませんが、データベースを説明する可能性が高いです。

これらの2つのオプションのいずれか以外のものを使用するには、この時点で異常な状況が発生します。

XMLの場合は

+1。少しオーバーヘッドがありますが、解析、読み取り、デバッグは簡単です。スキーマを使用している場合、厳密にすることができます。 XSLTで簡単に変換でき、非常にポータブルです(有線またはペンドライブで:)

これは実際に特定の状況に依存します。さまざまな質問への回答に対してオプションを検討する必要があります。

  • どのくらいのデータを保存する必要がありますか?コンパクトな表現のために最適化する必要がありますか?
  • 読み取り/書き込みのパフォーマンスは重要ですか?ディスクアクセスと影響の少ないシリアル化と逆シリアル化を最適化する必要がありますか?
  • ファイル内でランダムアクセスが必要ですか?データ内でシークするために構造を最適化する必要がありますか?
  • このデータは異なるシステム間で、おそらく異なる文字エンコーディングで使用されますか?移植性を最適化する必要がありますか?

データ自体の性質が影響します。フラットリスト構造ですか?木ですか?巡回グラフですか?レコードの幅は固定ですか、可変ですか?

これらの質問に対する答えがわかったら、オプションを選択して、できるだけシンプルに保つことができます。多くの場合、一般的なオプション(XML、CSV、YAML)が目的に合っています。そうでない場合は、独自の書式設定と独自の書き込みおよび読み取り手順を開発する必要があります。

非常に多くの可能性がありますが、最も実用的なのはXMLでなければなりません

  • ほぼすべての開発プラットフォームに適切なXMLライブラリがあります
  • ほとんどのプラットフォームでは、数行のコードでオブジェクトグラフをシリアル化できるため、XMLを簡単に実装できます
  • ほとんどのプラットフォームにはメモリやストリーミングリーダーが搭載されているため、メモリをあまり使用せずに非常に大きなファイルを処理できます
  • ほとんどのプラットフォームはXSLTトランスフォーマーを提供するため、XMLから非XMLにでも、ある形式から別の形式にファイルを移動できます
  • 非常に大きなファイルを処理するXMLのインデックス拡張機能もあります
  • XMLには、読み取る前にフォーマットを検証するXSDがあります
  • XMLは、単純または複雑なオブジェクトを表すことができます
  • ファイルサイズが心配な場合は、最終的なXMLを圧縮してください。この手法はMicrosoft Officeなどで使用されています
  • XMLはまだ人間が読める
  • XMLは一般的な標準です
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top