2017-05-22 18 views
1

私は、ファイル全体を読み書きすることなく、さまざまな位置で大きなバイナリファイルにアクセスする効率的な方法を探しています。大きなファイルの小さな変更を保存するにはどうすればよいですか?

<id><type><some_atributes><just_few_bytes>\n 
<id><type><some_atributes><block_holding_KB_of_data>\n 
<id><type><some_atributes><some_other_bytes>\n 
... 

私の目的は、特定のIDにジャンプして、レコードを上書きすることです:

ファイルには、各固定長データと可変長のデータ、例えばを含む、ラインの非常に高い数で構成されます新しいデータ。

私はseek()fwrite()のことを考えていましたが、問題は、読み取り/行の終わりのための各バイトを確認せずに効率的に書き込む方法にseek()を右行/位置にありますか?データベースにも同様の問題はありませんか?

+0

賢明にファイルをチャンクに分割する...関連するチャンクを変更し、完了したらファイル全体をアセンブルしますか? – WhiZTiM

+0

この質問を参照してください:https://stackoverflow.com/q/43006281/1865694 –

+0

固定長のものを別々のファイルに入れたり、最初に入れたり、各エントリに対して、そのチャンクが存在するファイルにオフセットを格納したりするのはどうでしょうか?固定サイズの索引付けにより、ランダムアクセスが可能になります。レコードごとに複数の読み込みによって発生するヒットを減らすには、インデックスに直接格納される少数のデータバイトを選択します。しかし、同じ仕様の "行"と "データのKB"について話するのは奇妙に思えます。バイナリの場合、 "\ n"を持っていないか、まったく必要としません。 – Peter

答えて

1

私の目標は、特定のIDにジャンプし、新しい データでレコードを上書きすることです。

これを実行するには、ファイル全体を少なくとも1回トラバースする必要があります。あなたのデータはidとタグ付けされているようですが、map<id,position_in_file>を作成し、そのマップをseekg(position_in_file)経由で直接ジャンプに使用することができます。

関連する問題