4

適度なサイズのテキストファイル(〜850kb、10,000行以上)があるとしましょう

そして、ファイル全体に広がる特定の行(または複数の行)を置き換えたいと思います。

これを行うための現在の方法には、ファイル全体の書き直しが含まれます。私が使用している現在の方法は、ファイル全体を1行ずつ読み取り、.tmpファイルに書き込みます。完了したら、tmpファイルの名前を元のソースファイルにrename()します。

動作しますが、遅いです。そしてもちろん、ファイルが大きくなるにつれて、実行時間も大きくなります。

1行か2行を置き換えたり削除したりする必要があるたびにファイル全体を書き直すことなく、(PHPを使用して)ジョブを実行する別の方法はありますか?

ありがとう!私は周りを見回しましたが、stackoverflowでこれに対する答えを見つけることができませんでした。

4

2 に答える 2

6

置換が元の行とまったく同じサイズである場合はfwrite()、ファイル内のその場所だけで問題ありません。しかし、それが異なる長さ (短いまたは長い) の場合は、置換後に来るファイルの部分を書き直す必要があります。

これを回避する方法はありません。「新しい」行が短いとファイルにギャップが残り、「新しい」行が長いと次の行の最初の部分が上書きされます。

基本的に、元のボードを動かさずに、別のボードの真ん中に木片を挿入できるかどうかを尋ねています。

于 2012-04-05T14:55:05.993 に答える
3

ファイルが一般的なファイルシステムに保存される方法のため、できません。ファイルは常に、ディスク領域の 1 つ以上の「ブロック」を占有します。ブロックのサイズは、たとえば 4096 バイトです。1 バイトのデータを持つファイルは 1 ブロック全体を占有しますが (使用可能なディスク領域の 4096 バイトを消費します)、4097 バイトのファイルは 2 ブロックを占有します (8192 バイトを消費します)。

ファイルから 1 バイトを削除すると、占有するブロックの 1 つに 1 バイトのギャップが生じ、ディスクに保存できなくなります。他のすべてのバイトをファイルの先頭に 1 バイトシフトする必要があります。これは、現在のブロックと後続のすべてのブロックに影響します。

逆に、ブロックの途中にバイトを追加すると、同じ問題が発生します。4096 バイトに収まらないバイトが 1 つ以上あるため、次のブロックにシフトする必要があります。ファイル (およびすべてのブロック) の最後に到達するまで、以下同様です。

ブロック内で占有されていないバイトを持つことができる唯一の場所は、ファイルを形成する最後のブロックの最後です。

于 2012-04-05T15:01:26.413 に答える