いくつかのトリックにより、編集がより簡単かつ迅速になります。
- アクセスを高速化するためにインデックスを作成します。 ユーザーが何もしていないときに、ファイルをざっと見てインデックスを作成すると、ファイル内の特定の場所をすばやく見つけることができます(以下を参照)。
- ユーザーが行った変更のみを保存します。 ユーザーが保存するまで、それらをファイルに直接適用しようとしないでください。
- ユーザーがポイントにジャンプしたときにメモリに読み込む量に制限を設定します。最初に1つまたは2つの画面のデータを読み取って表示できるようにします。次に、ユーザーがすぐに新しいスポットにジャンプしない場合は、現在のスポットの少し前と少し後に読みます。
索引付け:
ユーザーが行XまたはタイムスタンプTにジャンプしたい場合、改行と文字を数えてファイル全体をスキミングしたくありません。データをスキムし、レコードを作成します。たとえば、50行ごとに、バイトオフセット、文字数、および行番号を記録します。このデータは、ハッシュテーブル、ツリー、または順序付きリストに保存できます。次に、ユーザーがファイル内にジャンプすると、最も近いインデックススポットを見つけて、要求されたポイントが見つかるまでそこから読み取ることができます。この手法は、1文字あたりのバイト数が異なるUnicodeを使用する場合に特に便利です。ファイルが非常に大きい場合、完全なインデックスがメモリに収まらない場合は、インデックスポイントを制限してより広い間隔で配置するか、インデックスを一時ファイルに保存することをお勧めします。
大きなファイルの編集と変更:
Harveyが提案したように、変更はメモリに(diffとして)のみ保存し、入力から出力へのストリーミングによって保存されたときにファイルに適用します。ツリーまたは順序付きリストが役立つ場合があるため、入力から出力に書き込むときに変更を加える必要がある次の場所をすばやく見つけることができます。
変更が大きすぎてメモリに収まらない場合は、別の一時ファイル(おそらく元のフォルダと同じフォルダ)で変更を追跡することをお勧めします。この変更ファイルに新しい変更を追加して、変更の継続的なリストを書き続けることができます。保存するときは、一時ファイルを削除する前に、変更リストを読み、適用する変更の最終リストを作成します。パフォーマンス上の理由から、変更ログファイルの書き換えを避けることが役立つ場合があります。代わりに、その最後に追加し、保存を実行するときに冗長な編集やキャンセルした編集を削除してください。
興味深い事実:変更ログに使用するのと同じ構造を使用して、Undo/Redo情報を提供できます。