1

編集: ハードドライブが実際にデータを書き込む方法が原因で、このリストのスキームはどれも確実に機能しないことに注意してください。それらを使用しないでください。データベースを使用するだけです。SQLite はシンプルで優れています。

UTF-8 文字列のタプルをディスクに保存する最もローテクだが信頼できる方法は何ですか? 信頼性を確保するために、ストレージは追加専用にする必要があります。

私が実験しているドキュメント ストレージ システムの一部として、UTF-8 タプル データをディスクに保存する必要があります。明らかに、本格的な実装には、Amazon S3、Project Voldemort、または CouchDB などを使用したいと考えています。

ただし、現時点では実験中であり、まだプログラミング言語にしっかりと落ち着いていません。私は CSV を使用してきましたが、奇抜な Unicode や予期しない空白 (垂直タブなど) を保存しようとすると、CSV が脆くなる傾向があります。

ストレージに XML や JSON を使用することもできますが、追加のみのファイルには適していません。これまでの私の最善の推測は、各文字列の前に含まれるバイト数を示す 4 バイトの符号付き整数が先行し、-1 の整数値はこのタプルが完全であることを示す、かなり特異な形式です。これは CSV の改行に相当します。 . 頭痛の主な原因は、ディスク上の整数のエンディアンを決定しなければならないことです。

編集:実際には、これは機能しません。文字列の書き込み中にプログラムが終了すると、データは取り返しのつかないほどずれます。アボートされたタプルの後にアラインメントを回復できるようにするには、何らかの帯域外シグナリングが必要です。

編集 2: テキスト ファイルへの追加時に原子性を保証することは可能ですが、パーサーは非常に重要です。上記のパーサーを今書いています。

編集 3: http://github.com/MetalBeetle/Fruitbat/tree/master/src/com/metalbeetle/fruitbat/atrio/で最終結果を表示できます。

4

2 に答える 2

2

各フィールドを区切るタブと、各レコードを区切るキャリッジリターンをお勧めします。

各文字列内で、フィールドに影響を与えるすべての文字を置き換え、解釈とレンダリングを記録します。これには、制御文字(U + 0000–U + 001F、U + 007F–U + 009F)、非グラフィック行および段落区切り文字(U + 2028、U = 2029)、方向制御文字(U + 202A–U +)が含まれます。 202E)、およびバイト順序マーク(U + FEFF)。

それらは、一定の長さのエスケープシーケンスに置き換える必要があります。エスケープシーケンスは、まれな(アプリケーションの)文字で始まる必要があります。エスケープ文字自体もエスケープする必要があります。

これにより、新しいレコードを簡単に追加できます。目視検査および変更のためにファイルを任意のスプレッドシートまたはワードプロセッシングプログラムにロードできるという追加の利点があり、デバッグ目的に役立つ可能性があります。

ファイルは有効なUTF-8ドキュメントになるため、これもコーディングが簡単です。したがって、標準のテキスト読み取りおよび書き込みルーチンを使用できます。これにより、必要に応じて、複雑にすることなく、UTF-16BEまたはUTF-16LEに簡単に変換することもできます。

例:

U+0009 CHARACTER TABULATION becomes ~TB
U+000A LINE FEED            becomes ~LF
U+000D CARRIAGE RETURN      becomes ~CR
U+007E TILDE                becomes ~~~
etc.

フィールド区切り文字としてタブがコンマよりも優れている理由はいくつかあります。カンマは通常のテキスト文字列(英語のテキストなど)内でより一般的に表示されるため、より頻繁に置き換える必要があります。また、スプレッドシートプログラム(Microsoft Excelなど)は、タブ区切りファイルをより自然に処理する傾向があります。

于 2010-06-30T16:56:10.247 に答える
1

ここでは主に大声で考えています...

本当に低技術は、(たとえば) null バイトをセパレーターとして使用し、出力に表示されるすべての null バイトを追加の null で「引用」することです。

おそらく、それと一緒にSCSUを使用することができます。

または、 gzip形式を調べる価値があるかもしれません。

gzip ファイルは、一連の「メンバー」(圧縮されたデータ セット) で構成されます。

[...]

メンバーは、ファイル内で次々に出現するだけで、メンバーの前、間、後に追加情報はありません。

これらの各メンバーには、オプションの「ファイル名」、コメントなどを含めることができ、メンバーを追加し続けることができると思います。

または、トレント ファイルで使用されるbencodeを使用することもできます。またはBSON

ウィキペディアのデータシリアル化形式の比較も参照してください。

それ以外の場合、各文字列の前にその長さを付けるというあなたの考えは、おそらく最も単純なものだと思います。

于 2010-06-30T16:03:40.587 に答える