-PR-
締切り
済み

テキスト・エディタのバッファ管理

  • 暇なときにでも
  • 質問No.2263
  • 閲覧数259
  • ありがとう数19
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 0% (0/8)

ディスク・ブロック・サイズが例えば4KBで,32MBのテキストを編集するとします.メモリ・サイズは16MBで,ファイル全体をキャッシュできないと仮定します.
テキスト・エディタで,文章の先頭に1文字追加したとします.そしてセーブした場合,たった1文字の追加のために,それ以降のバイトストリームは,ぜんぶ1バイト下にずれるのでしょうか?
絵を使うと簡単に説明できるのですが,状況は理解できますでしょうか?
32MBバイトのデータを全部書き換えるというのは,非現実的だと思うので.
ビデオ編集などでは,もっとインテリジェントにやっていると思います.
テキスト・エディタの作り方を解説しているページなどありましたら,
教えてください.
Muleのソースコードを読む時間はありません.
よろしくお願いします.
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全3件)

  • 回答No.1
レベル13

ベストアンサー率 26% (511/1924)

前半部分のバイトストリーム云々はちょっとわかりませんが、後半だけ。 テキストエディタっていろんな作り方があると思いますが、その一つでリスト構造と いうのがありますね。 改行毎に1つのバッファに入れて、行番号と共に保存しておけば、行挿入・削除は それほど苦にはならないと思います。 最後の保存時につじつまを合わせて保存するのではないでしょうか? ...続きを読む
前半部分のバイトストリーム云々はちょっとわかりませんが、後半だけ。
テキストエディタっていろんな作り方があると思いますが、その一つでリスト構造と
いうのがありますね。
改行毎に1つのバッファに入れて、行番号と共に保存しておけば、行挿入・削除は
それほど苦にはならないと思います。
最後の保存時につじつまを合わせて保存するのではないでしょうか?
補足コメント
syoujik

お礼率 0% (0/8)

テキスト編集中は,
ファイルに(行番号,1行のテキスト)というセットで保存し,
ファイル・クローズ時に,
ディスクに保存したセット列を再度読み出し,
1行のテキストを行番号でソートし直し,
ソートした結果をもう一度ファイルに格納するのでしょうか?
頻繁に追加削除を繰り返した32MBファイルを
ソートし直すというのは,かなり時間がかかる作業だと思います.

再度質問です.
アドレス:0123456789ABCDE
テキスト:ABCDEFHIJKLMNOP
アドレスはディスク上のアドレスで,テキストは各アドレスに保存されているデータです.例えばアドレス5には文字Fを格納します.
このときFとHの間にGを挿入するとき,H以降の文字列は
アドレスが1つ大きくなるはずです.32MBのテキストを保存するとき,
たった1文字のデータを挿入しただけで,ほぼ32MBのデータを
コピーし直す処理が必要になります.
テキスト・エディタは本当にそんなことやっているのでしょうか?
投稿日時 - 0000-00-00 00:00:00
  • 回答No.2
レベル13

ベストアンサー率 26% (511/1924)

ファイルって開いたままで無いとダメですか?オンメモリで操作するならそんなに時間が かかるとは思えないんですけど・・・最近の開発環境では文字列を扱うクラスなどが提供 されていますので、そんなに難しくないと思うんですけど・・・ ディスク上のアドレスを考えるから難しくなるんじゃないでしょうか?32MBくらいなら オンメモリでも何とかなると思うんですけどね。オンメモリと言ってもOSの仮想メモ リに頼 ...続きを読む
ファイルって開いたままで無いとダメですか?オンメモリで操作するならそんなに時間が
かかるとは思えないんですけど・・・最近の開発環境では文字列を扱うクラスなどが提供
されていますので、そんなに難しくないと思うんですけど・・・

ディスク上のアドレスを考えるから難しくなるんじゃないでしょうか?32MBくらいなら
オンメモリでも何とかなると思うんですけどね。オンメモリと言ってもOSの仮想メモ
リに頼ってると思いますが・・・
ファイルの入出力管理にしてもOSやAPIなどに任せるようにすれば、悩む必要は無いと
思います。逆に、いまどきの開発環境はそんな下位レベルでの操作は推奨されませんね。

また、実際に2~3MBくらいのファイルを操作するとかなり重くなりますよ。
プログラミングに関しては「だと思う」ではなく、どんどん試してみることをお勧め
します。その中で自分なりの考えが浮かぶ場合も有りますし。
10MBくらいのファイルが軽く読み書きできるエディタ作ってください。
  • 回答No.3

こういう場合はピーステーブルを使う方法と固定長のブロックを作って管理する方法があります 固定長のブロックを作る場合はLRUやFIFOでブロックをキャッシュしておき、あふれた場合はディスクに書き込み。ブロックからあふれた場合は新たなブロックを作ってあふれた分を格納。ブロック分削除する場合はブロックごと削除し、一部分だけにとどまる場合はブロックをそのまま残します。もし、メモリーに入りきらない場合は一番古いや ...続きを読む
こういう場合はピーステーブルを使う方法と固定長のブロックを作って管理する方法があります

固定長のブロックを作る場合はLRUやFIFOでブロックをキャッシュしておき、あふれた場合はディスクに書き込み。ブロックからあふれた場合は新たなブロックを作ってあふれた分を格納。ブロック分削除する場合はブロックごと削除し、一部分だけにとどまる場合はブロックをそのまま残します。もし、メモリーに入りきらない場合は一番古いやつをディスクに書き込み、要求があったら、ディスクから読み込むということを行います

ピーステーブルを使う場合は追加や削除が行われた地点ですでにあるブロックを分割し、削除の場合は何もせずに放置。追加された場合はそこに挿入します。こちらの場合も、メモリーに入りきらない場合は固定長のブロックと同様のやり方で管理します
(なお、ファイルを読み込んだ場合、その部分だけはディスク上にあるのでメモリー上に置く必要はありません)
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ