- 締切済み
テキスト・エディタのバッファ管理
ディスク・ブロック・サイズが例えば4KBで,32MBのテキストを編集するとします.メモリ・サイズは16MBで,ファイル全体をキャッシュできないと仮定します. テキスト・エディタで,文章の先頭に1文字追加したとします.そしてセーブした場合,たった1文字の追加のために,それ以降のバイトストリームは,ぜんぶ1バイト下にずれるのでしょうか? 絵を使うと簡単に説明できるのですが,状況は理解できますでしょうか? 32MBバイトのデータを全部書き換えるというのは,非現実的だと思うので. ビデオ編集などでは,もっとインテリジェントにやっていると思います. テキスト・エディタの作り方を解説しているページなどありましたら, 教えてください. Muleのソースコードを読む時間はありません. よろしくお願いします.
- みんなの回答 (3)
- 専門家の回答
みんなの回答
こういう場合はピーステーブルを使う方法と固定長のブロックを作って管理する方法があります 固定長のブロックを作る場合はLRUやFIFOでブロックをキャッシュしておき、あふれた場合はディスクに書き込み。ブロックからあふれた場合は新たなブロックを作ってあふれた分を格納。ブロック分削除する場合はブロックごと削除し、一部分だけにとどまる場合はブロックをそのまま残します。もし、メモリーに入りきらない場合は一番古いやつをディスクに書き込み、要求があったら、ディスクから読み込むということを行います ピーステーブルを使う場合は追加や削除が行われた地点ですでにあるブロックを分割し、削除の場合は何もせずに放置。追加された場合はそこに挿入します。こちらの場合も、メモリーに入りきらない場合は固定長のブロックと同様のやり方で管理します (なお、ファイルを読み込んだ場合、その部分だけはディスク上にあるのでメモリー上に置く必要はありません)
- shigatsu
- ベストアンサー率26% (511/1924)
ファイルって開いたままで無いとダメですか?オンメモリで操作するならそんなに時間が かかるとは思えないんですけど・・・最近の開発環境では文字列を扱うクラスなどが提供 されていますので、そんなに難しくないと思うんですけど・・・ ディスク上のアドレスを考えるから難しくなるんじゃないでしょうか?32MBくらいなら オンメモリでも何とかなると思うんですけどね。オンメモリと言ってもOSの仮想メモ リに頼ってると思いますが・・・ ファイルの入出力管理にしてもOSやAPIなどに任せるようにすれば、悩む必要は無いと 思います。逆に、いまどきの開発環境はそんな下位レベルでの操作は推奨されませんね。 また、実際に2~3MBくらいのファイルを操作するとかなり重くなりますよ。 プログラミングに関しては「だと思う」ではなく、どんどん試してみることをお勧め します。その中で自分なりの考えが浮かぶ場合も有りますし。 10MBくらいのファイルが軽く読み書きできるエディタ作ってください。
- shigatsu
- ベストアンサー率26% (511/1924)
前半部分のバイトストリーム云々はちょっとわかりませんが、後半だけ。 テキストエディタっていろんな作り方があると思いますが、その一つでリスト構造と いうのがありますね。 改行毎に1つのバッファに入れて、行番号と共に保存しておけば、行挿入・削除は それほど苦にはならないと思います。 最後の保存時につじつまを合わせて保存するのではないでしょうか?
補足
テキスト編集中は, ファイルに(行番号,1行のテキスト)というセットで保存し, ファイル・クローズ時に, ディスクに保存したセット列を再度読み出し, 1行のテキストを行番号でソートし直し, ソートした結果をもう一度ファイルに格納するのでしょうか? 頻繁に追加削除を繰り返した32MBファイルを ソートし直すというのは,かなり時間がかかる作業だと思います. 再度質問です. アドレス:0123456789ABCDE テキスト:ABCDEFHIJKLMNOP アドレスはディスク上のアドレスで,テキストは各アドレスに保存されているデータです.例えばアドレス5には文字Fを格納します. このときFとHの間にGを挿入するとき,H以降の文字列は アドレスが1つ大きくなるはずです.32MBのテキストを保存するとき, たった1文字のデータを挿入しただけで,ほぼ32MBのデータを コピーし直す処理が必要になります. テキスト・エディタは本当にそんなことやっているのでしょうか?