2013-01-03 6 views
6

可能性の重複:
What are important points when designing a (binary) file format?データファイルの構造を設計する方法に関する参考文献/リソースはありますか?

私は、ファイル内のデータを格納するプログラムを開発するつもりです。

ファイルが大きくなる可能性があります。ファイル内のデータは基本的に可変長レコードで構成されています。レコードにはランダムアクセスが必要です。

データファイルの構造を設計する方法については、いくつかのリソース/書籍を読んでみたいです。しかし、私はまだ見つけることができません。

ご提案は大変ありがとうございます。

+0

どのような変数がデータに含まれますか?異なる表記法を持つ長い文字列ですか? – billz

+0

この質問は、その必要性(可変長レコードへのランダムアクセス)に関してはっきりとしているので、重複していません。 – MSalters

+1

@limi:なぜファイルを決めたのですか?この目的のためにデータベースが存在し、データを永続ストレージにマップするために必要なすべてのロジックを実装しています。 – MSalters

答えて

2

問題はデータベース理論の中心的なテーマです。

件名の文章は、あなたに良いアイデアを与えるはずです。 UNIから標準のテキストは:

Fundamentals of Database Systems- Elmasari & Nava (PDF)(Amazon)

別のアプローチ構造体のメモリマップされた配列を使用することで、私のbountied answer to a similar question

を見てみましょうさらに別のアプローチは、Google protobufのようなバイナリプロトコルを使用することです書き込み時にデータをファイルに「送信」し、書き込み時に「受信」します。

1

このデータをmysqlのような永続DBストアに保存することを検討していない理由はありますか?これらのシステムは、データ検索を高速化するために適切なインデックスを使用してランダムデータアクセスを処理するように構築されています。さらに、ファイルを読み込んでいる間は、索引や問合せ言語がないため、ファイル全体を読んで必要なものを取得する必要があります。

これに加えて、複数の実行中のプロセスがデータが破損することなく同じデータにアクセスできるようにするシステムが用意されています。データの復旧に矛盾が生じました。

ちょうど記憶が単純な部分であるので、そこで終わらない。最終的に他のすべてのソリューションを提供する必要があります。利用可能なものを使いやすくする。

+0

または単にzipアーカイブを作成してすべてを入れることができます。これは、.jarファイルまたは.apkファイルまたはその他の同様のソリューションで採用されている主な概念です。 – user1824407

+0

ジップはアーカイブです。しかし、質問には「私はレコードにランダムアクセスが必要です」と書かれていますので、私はmysqlを提案しました... –

+0

...そしてタイトルはデータファイルを言っています...おそらくこの質問は説明が必要です。また、このためのシリアル化をお勧めします – user1824407

2

あなたが探している答えが「読むべき本」であれば、私は助けることはできません。

「どのようにするか」があなたにとってもよい場合は、私はいくつかの提案をしました。

1つの良い解決策は、Srykarによって提案されたものです。私は、MySQLの代わりにSQLiteを使うと付け加えます。あなたのプログラムに埋め込むことができるオープンソースのCライブラリです。 SQLステートメントでやったやり方と同じようにDBにデータを格納することができますが、代わりにCライブラリ関数を呼び出すことができます。あなたの場合は、すべてをメモリに保存し、適切な時間にデータをディスクに保存することができます。

参考: http://www.sqlite.org

別のオプションは、古い "それを自分のやり方" です。つまり、あなたのデータをファイルに保存するのは非常に複雑なことではありません(データが非常に構造化されている場合を除きますが、この場合はオプションnr。1を使用します)。

ファイルの構造をどのようにしたいかの計画を書き留めます。そして、ディスクにファイルを書き込むときとそれを読むときに、データをメモリに再格納するときの両方で、その計画に従います。

nのレコードがある場合。 nをディスクに書き込み、各レコードを書き込みます。

各レコードに可変長がある場合は、レコードを書き込む前に各レコードの長さを書き込みます。

あなたの質問には「ランダムアクセス」があります。おそらく、ファイルが非常に大きく、アクセス時にディスクから読みたい部分だけを表示することになります。

インデックスを作成する予定がある場合は、そのインデックスはファイルの先頭から各要素のオフセットをバイト単位で示します。インデックスをファイルの先頭に格納し、データを格納します。

ファイルを読み込むと、インデックスの読み込みが始まり、必要なデータへのオフセットが取得され、ファイルのその部分が読み込まれます。

これらは単にアイデア...彼らは助け

希望を得るために、非常に基本的な例です!

+0

ありがとう、いくつかの調査の後、私はSQLiteが私にとって最良の選択だと思う。私自身のファイルフォーマットを開発することは、削除/挿入をサポートするために努力する価値はなく、同時に良いパフォーマンスを得るためには、品質は容易ではありません。 – limi

関連する問題