私はちょうど大きな(ギガバイト)サイズのファイルからいくつかの行を切り取る必要がある問題に遭遇し、メモリからファイルを読み取ろうとするとCPU使用率が発生する可能性があることに気づき、その場で編集したいと思いました... ...次の問題が発生しました。
...そしてこれらは:
ext3
しかし、私は他のことについて考えています。私は、すべてのファイルシステム(たとえば)がディスク領域にマップされたファイルの断片のようなものを記述できるように、リンクリストのようなものを使用する必要があると思います(ただしわかりません)。 。
したがって、次のことを行うことが可能でなければなりません。たとえば、次のようなファイルがあるとしますbigfile.dat
(数字はバイトオフセットを表す必要がありますが、ソートするのは少し難しいです)。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
L 1\n L 2\n L 3\n L 4\n L 5\n L 6\n
原則として、検索用にファイルをターミナルアプリケーションにロードできます。ツールを呼び出すと仮定し、同じファイル(行番号を含む)がどのように表示されるかとeditsegments bigfile.dat
似ているとします。less -N bigfile.dat
1 1 L 1
2 2 L 2 *
3 3 L 3
4 4 L 4 *
5 5 L 5
6 6 L 6
bigfile.dat (END)
コマンド(たとえば、行の削除)を入力してd
別のキーまたはマウスをクリックすると、*
行2と4の間のすべての項目を削除する必要があるというメッセージが表示されたとします。その後、プログラムは応答し、次のことを表示します。
1 1 L 1
2 5 L 5
3 6 L 6
bigfile.dat (END)
一番左の最初の列には「新しい」行番号(切り取り前)が表示され、2番目の列には「前」行番号(切り捨て前)が表示され、次に実際の行の内容が表示されます。
さて、この偽のアプリケーションが終了した後に何が起こるのか想像してください。editsegments
何よりもbigfile.dat
影響を受けません。ただし、同じディレクトリにbigfile.dat.segments
次の内容を含む追加のテキストファイルがあります。
d 4:15 # line 2-4
bigfile.dat.iedit
...また、"symlink"のような特別なファイルが表示されます。これを「it」と呼びます。
bigfile.dat.iedit
基本的に、これらすべての結果は次のように今開こうとすると次のようになりますless -N bigfile.dat.iedit
。 「編集された」コンテンツをインポートしたいと思います。
1 L 1
2 L 5
3 L 6
bigfile.dat (END)
...これは、OSに何らかの方法で指示し、$FILE.iedit
開いたときに最初に開いて元のファイルのバイト4〜15を省略する必要が$FILE.segments
あるd 4:15
ことを示すようにすることで達成できます。これにより、次のような結果が得られます。次の結果:
0 1 2 3 4 5 6 7 8 9 10 11 12,3,4 15 16 17 18 19 20 21 22 23
L 1\n
L
2
\n
L
3
\n
L
4
\n
L 5\n
L 6\n
0 1 2 3---------------------------------- -->16 17 18 19 20 21 22 23
つまり、仮説ファイルシステムの概念では、コンテンツの各バイトにはチェーンの次のバイトへの「リンク」も含まれます。ファイルシステムにスクリプトに基づいて新しい接続リストを構築し、次のようにコンテンツを提供するように指示できる必要があります。変更された接続のリストとして表示される特別なファイル(シンボリックリンクまたはパイプ)。
これはタイトルで「スクリプト可能」という意味です。 「新しい」接続リストは、$FILE.segments
ユーザーがテキストエディタで編集できる(またはフロントエンドアプリケーションで生成できる)スクリプトファイル()によって制御できます。 「複数回」とは、bigfile.dat
プロセス中にまったく変更されないことを意味します。したがって、今日の最初の(元の)ギガバイトを編集し、進行状況を($FILE.segments
)に保存できます。その後、明日の2番目のギガバイトを編集し、進行状況を($FILE.segments
)に戻す - 元のコンテンツは変更されbigfile.dat
ていません。
editsegments --finalize bigfile.dat
すべての編集が完了したら、新しい接続リストをの内容に永続的にエンコードする一種のコマンド(たとえば)を呼び出すことができますbigfile.dat
(それに応じて、bigfile.dat.segments
およびを削除bigfile.dat.iedit
)。あるいは、より簡単には、次のようにすることができます。
cp bigfile.dat.iedit /path/to/somewhere/else/bigfile.modified.dat
もちろん、d
eleteスクリプトコマンドに加えてr
eplaceコマンドもあります。たとえば、次のようになります。
r 16:18 AAA
...説明:バイト16と18の間の内容を空白の後の18〜16 + 1 = 3バイトに置き換えます(例:)AAA
。リンクされたリストは、実際にはスクリプトコマンドの内容自体に「接続」することができます(図の下もエレテを含むd
)。
0 1 2 3 4 5 6 7 8 9 10 11 12,3,4 15 16 17 18 19 20 21 22 23
L 1\n
L
2
\n
L
3
\n
L
4
\n
L
5
\n
L 6\n
0 1 2 3---------------------------------- -->| 19 20 21 22 23
.
.
.
.
.
.
.
\n
r
1
6
:
1
8
AAA \n
.
.
.
.
今、私はプログラムがhexedit
(上記のように)次のようになりたいと思います。ここ)はファイルをその場で変更します。しかし、私はスクリプト可能性の利点(ターミナルアプリケーションでもGUIアプリケーションで管理できれば良いでしょう)と実際に元のファイルがないという利点があります。変更、すべての編集内容が準拠していることが確認されるまで。
そんなことができるのかよく分からない。下痢可能であっても(単純なユーザープログラムではなく)専用ドライバーが必要かもしれないと思いますが、とにかく尋ねる価値があると思います。 Linuxには似たようなものがありますか?
答えてくれてありがとう。
応援します!
ベストアンサー1
ディスクのファイル構造は、使用するファイルシステムによって異なります。実際のファイルシステムでは、あなたが説明するような接続リストを使用しません(fseek(3)
耐え難いことです)。これに最も近いのはマイクロソフトのものです。脂肪、デフォルトでは、データブロックのポインタを配列に移動して非表示にします。
ただし、ほとんどのファイルシステムはファイル内のデータブロックへのいくつかのポインタベースの参照を使用するため、原則としてファイル全体の内容ではなく、少数のポインタを混在させ、ブロックを表示してファイルを切り取ることができます。ブロック内のファイル。ファイルの中央部分は無料です。残念ながら、これは非常に便利な作業ではありません。ファイルブロックはかなり大きく(通常は4KiB)、ファイルの構造(ラインまたは他のサブセグメンテーション)と合理的に整列することはほとんどありません。