重複の可能性:(
バイナリ)ファイル形式を設計する際の重要なポイントは何ですか?
データをファイルに保存するプログラムを開発します。
ファイルが大きくなる可能性があります。ファイル内のデータは、基本的に可変長レコードで構成されています。そして、レコードにランダムアクセスする必要があります。
データファイルの構造を設計する方法についてのいくつかのリソース/本を読みたいだけです。しかし、私はまだ何も見つけることができません。
どんな提案でも大歓迎です。
重複の可能性:(
バイナリ)ファイル形式を設計する際の重要なポイントは何ですか?
データをファイルに保存するプログラムを開発します。
ファイルが大きくなる可能性があります。ファイル内のデータは、基本的に可変長レコードで構成されています。そして、レコードにランダムアクセスする必要があります。
データファイルの構造を設計する方法についてのいくつかのリソース/本を読みたいだけです。しかし、私はまだ何も見つけることができません。
どんな提案でも大歓迎です。
http://decoy.iki.fi/texts/filefd/filefdが役立つ場合があります。これは、考慮すべきテクニックの一般的な出発点です。
SOに関するこの質問もご覧ください:(バイナリ)ファイル形式を設計する際の重要なポイントは何ですか?
あなたが説明する問題は、データベース理論の中心的なテーマです。
この主題に関するまともなテキストは、あなたにいくつかの良いアイデアを与えるはずです。uniからの標準テキストは次のとおりです。
データベースシステムの基礎-Elmasari&Nava(PDF) (Amazon)
別のアプローチは、メモリマップされた構造体の配列を使用することです。同様の質問に対する私の豊富な回答を見てください。
さらに別のアプローチは、Google protobufのようなバイナリプロトコルを使用し、書き込み時にデータをファイルに「送信」し、書き込み時にデータを「受信」することです。
あなたが探している答えが「どの本を読むべきか」であるなら、私は仕方がありません。
「それをどうするか」があなたにとっても良いかもしれないなら、私はいくつかの提案をします。
良い解決策の1つは、Srykarによって提案されたものです。MySQLの代わりにSQLiteを使用することを付け加えておきます。これは、プログラムに埋め込むことができるオープンソースのCライブラリです。SQLステートメントの場合と同じようにデータをDBに格納できますが、代わりにライブラリC関数を呼び出します。あなたの場合、すべてをメモリに保持してから、適切なタイミングでデータをディスクに保存することができます。
もう1つのオプションは、古い「自分でやる」です。つまり、データをファイルに保存することについては、それほど複雑なことはありません(データが非常に構造化されている場合を除きますが、この場合はオプション番号1を使用します)。
ファイルの構造をどのようにするかについての計画を書き留めます。そして、ファイルをディスクに書き込むときと、ファイルを読み取るとき、データをメモリに復元するときの両方で、その計画に従います。
n個のレコードがある場合。nをディスクに書き込んでから、各レコードに書き込みます。
各レコードの長さが可変の場合は、レコードを書き込む前に各レコードの長さを書き込んでください。
あなたはあなたの質問で「ランダムアクセス」について話します。おそらく、ファイルが非常に大きく、アクセス時にディスクから関心のある部分だけを読み取りたいということです。
もしそうなら、インデックスを作成することを計画してください。そのインデックスは、ファイルの先頭からの各要素のオフセットをバイト単位で示します。ファイルの先頭にインデックスを保存してから、データを保存します。
ファイルを読み取るときは、インデックスの読み取りを開始し、必要なデータへのオフセットを取得して、ファイルのその部分を読み取ります。
これらは非常に基本的な例であり、アイデアを得るためだけのものです...
彼らが助けてくれることを願っています!
このデータをmysqlのような永続的なDBストアに配置することを検討していない理由はありますか?これらのシステムは、適切なインデックスを使用してランダムなデータアクセスを処理し、データの取得を高速化するように構築されています。さらに、ファイルから読み取る場合、インデックスやクエリ言語がないため、必要なものを取得するにはファイル全体を読み取る必要があります。
これに加えて、実行中の複数のプロセスがデータを破損することなく同じデータにアクセスできるようにするシステムがあります。不整合が発生した場合のデータ回復を提供しました。
したがって、保存するだけで簡単な部分であり、それだけではありません。最終的には、他のすべてのソリューションを提供する必要があります。利用可能なものを使用することをお勧めします。