2016-11-03 5 views
0

私はファイル全体を上書きせずにファイルの一部を書き直すことができるカスタムバイナリファイル形式を工夫しています。データは可変長の「要素」で構成されています。これらの要素は、ファイル内で削除、挿入、または変更することができます。このような変更は、エレメントの長さを変更することがあります。ここでファイル全体の書き換えを避けるためのファイル構造

は、私が検討していますものです:

  • ファイルは2つの主要部分である:ヘッダーとボディ。

  • ボディは、平均して100個の要素を保持する所定のサイズのブロックに分割されます。要素が作成されると、要素が格納されるのに十分な余裕を持って最初のブロックに書き込まれます。

  • 要素が変更されているときに、ブロックに十分な領域があればそれが書き換えられます。そうでなければ要素がブロックから削除され(ブロックが書き換えられます)、次に必要なスペース。
  • ヘッダーには、各ブロックのアドレスへのポインタと現在のサイズが含まれています。このデータは固定幅なので、ヘッダー全体を書き換えることなく、1つのヘッダーエントリを変更できます。

私の質問: ヘッダーのサイズを増やす必要がある場合、追加のヘッダースペースを作成するために全身を書き直す必要があります。ヘッダーが本文とは別のファイルだった場合は、この問題はありませんが、2つのファイルがあるという考えは嫌です。ヘッダーとボディを1つの物理ファイルに保持する方法はありますか?それぞれを別の物理ファイルに拡張することはできますか?

+0

ファイルへの書き込み頻度はどのくらいですか?いくつかの初期状態から始めて、しばらくの間、変更を記録するのですか、頻繁に変化し続ける構造で、一度に多くのコンテンツが変化しますか? – dasblinkenlight

+0

あなたはZipファイルが何をしたかを行うことができます:ファイルの* end *にヘッダーを置いてください。 – Amy

答えて

3

ファイル形式は、相互にリンクされたヘッダーのリストをサポートする必要があります。

ヘッダーには、ファイル内の次のヘッダーの位置を示すフィールド "next"があります。ヘッダーを追加する必要がある場合は、ファイルの末尾に追加し、ファイル内の位置を前の最後のヘッダーの「次の」フィールドに書き込んでください。

私の意見:簡単に使用できるSQLiteのようなソリューションが既に存在する場合、なぜ新しいフォーマットを発明するのですか?

+0

まあダン...それは完璧な意味合いです。 – MCHagen4

+0

そして、正直言って、新しいものを発明するよりも、おそらくSQLiteのようなものを使うことになるでしょう。私が尋ねた理由は、現在、いくつかの大きな欠点があるカスタムバイナリファイルを使用しているからです。これは私が "手動で"したい場合、これらの欠点を避けるために、このカスタムバイナリファイルをどのように再構築するかを考えるよう促しました。 – MCHagen4

+0

C#はバイナリファイルを処理するのに苦労します。私はそれを一度だけ特別なケースで行いました(何百万の小さなレコード、典型的な実行はこれらの何万ものものにアクセスするでしょう - インデックス全体を読んで、目的ではないとしてもディスクから取り出したものをキャッシュします)。最近では文書(pdf、xmlなど)以外のものはすべてテキストまたはSQLでなければなりません。 –

関連する問題