ホームページ  >  記事  >  バックエンド開発  >  PHP の大きなファイルの読み取りおよび書き込みの問題

PHP の大きなファイルの読み取りおよび書き込みの問題

WBOY
WBOYオリジナル
2016-06-23 13:43:54885ブラウズ


通常の学習や開発では、大量のデータの読み書きにさらされることはめったにないため、突然そのような必要が生じた場合、file_get_contents などのいくつかの比較を実行することがあります

fread などを使用してファイルを読み込むことができますが、読み込むファイルが大きすぎると、大きなファイルの読み書きを行うときに問題が発生します。私のニーズを満たすため、インターネット上ですでに公開されている例に基づいてまとめブログを書きます。

それでは、具体的には何が起こるのでしょうか? まず、PHP の基本的な実装である file_get_contents と fread について説明しましょう

PHP のファイル読み取り関数、file_get_contents と fread について説明します。これら 2 つの関数は実際には同じです。 、それらはすべてシステム メモリに内容を読み取ります。

しかし、ファイルの内容を文字列に読み込むだけの場合は、file_get_contents() を使用してください。そのパフォーマンスは、多くの fread() よりもはるかに優れています。

それほど大きくないファイルを読み取る場合は問題ありませんが、大きなファイル (2GB のログなど) を読み取る場合、マシンのメモリが 4G しかない場合は、

ファイル全体を読み取ってから保存すると、文字列を指定すると、システムのメモリが爆発してフリーズする可能性があります。これは、メモリの一部がシステムの動作と他のプロセスの動作を維持するためにまだ使用されているためです。この場合、メモリが必要になります。一度に大量のコンテンツを読み込む場合は、この

メソッドを使用してそれを回避してください。

PHP ファイルの読み取り:

以下は、上記のメモリが爆発する現象を説明するために、オンラインで大きなファイルを読み取る例です。 。


_______________________________ 無敵の分割線_______________________________________________


要件は次のとおりです:

約 500 万行の約 1G のログ ファイルがあり、PHP を使用して最後の数行の内容を返します。


実装方法:
1. file 関数を直接使用して操作します
注: file 関数はすべての内容を一度にメモリに読み取るため、PHP はこの関数を使用して、一部の不適切に作成されたプログラムがメモリを占有することを防ぎます。この値が -1 に設定されている場合、メモリの最大使用量はデフォルトで 16M に制限されます。使用は制限されません
以下は、このファイルの最後の行を抽出するために file を使用するコードです
コード全体の実行には 116.9613 (秒) かかります


私のマシンには 2 G あります。 F5 キーを押すと、システムが直接グレーになり、約 20 分後に回復します。そのため、これは最後の手段ではありません。あまり高く調整することはできません。そうでない場合は、コンピューター室に電話してマシンをリセットするしかありません。


_______________________________ 無敵の分割線 _______________________________

上記の例は、最後の数行を読み取る例ですが、ファイルの内容の走査。これはファイル全体を読み取ることと同じですが、内容の最後の数行を読み取りたい場合は、fseek を直接使用して内容の一部を位置決めして読み取ることもできます。


大きなファイルの読み取りと書き込みの方法について説明します。

大きなファイルの読み取り:


ファイルの一部を読み取る必要があるため、ファイルが特に大きくない場合は、file_get_contents または fread に付属するセグメンテーション パラメーターを使用して、チャンクで読み取ることができます

(この場所は必要だと感じます IO のピーク サイズを減らすためにスリープ関数を追加しますが、それが正しいかどうかはわかりません。誰かが私にアドバイスをくれることを願っています)

別の方法は、fgets を使用して a を 1 行ずつ読み取ることです。 fgetss はファイル ポインターを使用するため、1 行の読み取りが比較的効率的です。


以下に、fgets を使用して大きなファイルを読み取り、ファイルの内容をエンコードする例を示します (UTF-8 -> GBK)。コードは次のとおりです。 大きなファイルの書き込み:

ファイルの書き込みはハードディスクに書き込まれるため、ファイルが一度に書き込まれる場合、大きなファイルの書き込みコストは大きなファイルの読み取りに比べてそれほど高くありません。

効率の点では、一度に直接書き込むのが最も時間がかかり、効率的です。そのため、大きなファイルを書き込む場合は、一度に読み取って直接書き込むことをお勧めします。ファイルに。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。