目次
yield仕組み:簡単な例
実世界のユースケース:大きなファイルの処理
ジェネレーターの重要な利点
Advanced:キーと値を獲得します
留意すべき制限
結論
ホームページ バックエンド開発 PHPチュートリアル PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復

PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復

Aug 03, 2025 am 01:38 AM
PHP Functions

PHPジェネレーターを使用してキーワードを獲得して、メモリオーバーフローを防ぐために大きなデータセットを効果的に処理します。 1.ジェネレーターは、降伏値による怠zyな評価を実現し、一度にメモリに1つの値のみを残します。 2。ラインごとのFGETを使用するなど、ラインごとのラインごとの読み取り、ラインまたはCSVファイルの処理などのシナリオに適しています。 3.キー値のペアの出力をサポートし、キー名を明示的に指定できます。 4.メモリフットプリントが低い、簡潔なコード、およびforeachとのシームレスな統合の利点があります。 5.ただし、巻き戻しができないこと、ランダムアクセスをサポートしないなどの制限があり、再利用できず、反復を実行する前に再作成する必要があります。したがって、大量のデータを通過する必要がある場合、ジェネレーターの使用が優先される必要があります。

PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復

PHPで大規模なデータセットを扱う場合、メモリ使用量はすぐにボトルネックになる可能性があります。特に、数千または数百万のレコードを配列にロードする前に、処理する場合です。これは、 PHPジェネレーターyieldキーワードが入ってくる場所であり、すべてをメモリに一度にロードせずにデータを繰り返す強力な方法を提供します。

PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復

ジェネレーターは、メモリにデータセット全体を構築および保存する必要なく、データのセットを反復することができる特別な種類の機能です。値をreturn代わりに、実行者は一度に1つずつ値を生成し、各yieldと次の値が要求されたときに実行を一時停止します。


yield仕組み:簡単な例

このメモリが多いアプローチの代わりに:

PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復
関数getNumbers($ n){
    $ numbers = [];
    for($ i = 1; $ i <= $ n; $ i){
        $ numbers [] = $ i;
    }
    $番号を返します。
}

foreach(getNumbers(1000000)as $ num){
    echo "$ num \ n";
}

これにより、メモリに100万個の整数がある配列が作成されます。これは、高価で不要です。

ジェネレーターを使用すると、できます。

PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復
関数getNumbers($ n){
    for($ i = 1; $ i <= $ n; $ i){
        $ iを獲得;
    }
}

foreach(getNumbers(1000000)as $ num){
    echo "$ num \ n";
}

現在、一度にメモリに1つの値のみが存在します。関数は、各yieldの後に一時停止し、次の反復を待ち、その後継続し、メモリの使用量を大幅に削減します


実世界のユースケース:大きなファイルの処理

発電機の最も実用的なアプリケーションの1つは、ラインごとに大きなファイル(CSVやログなど)を読み取ることです。

関数readlines($ file){
    $ handle = fopen($ file、 &#39;r&#39;);
    if(!$ handle){
        新しい例外をスローします(「ファイルを開くことはできません:$ file ");
    }

    while(($ line = fgets($ handle))!== false){
        $ line;
    }

    fclose($ handle);
}

// 使用法
foreach(readlines( &#39;gage-log-file.txt&#39;)as $ line){
    エコー「処理:」。トリム($ line)。 "\ n";
}

ジェネレーターがなければ、 file()を使用してすべての行を配列にロードできますが、大きなファイルでクラッシュする可能性があります。 yield使用すると、メモリの使用量を低く予測可能に保つために、一度に1つのラインを処理します。


ジェネレーターの重要な利点

  • 低メモリフットプリント:一度に処理されるアイテムは1つだけです。
  • クリーンで読みやすいコード:通常のループのように見えますが、怠lazに動作します。
  • 怠zyな評価:値は必要なときにのみ生成されます。
  • foreachとのシームレスな統合:ジェネレータIteratorインターフェイスを実装するオブジェクトを返します。

Advanced:キーと値を獲得します

キーを明示的に指定することもできます。

関数getKeyValuePairs(){
    「最初」=> 1を獲得します。
    「2番目」=> 2;
    evel &#39;third&#39; => 3;
}

foreach(getKeyValuePairs()as $ key => $ value){
    echo "$ key:$ value \ n";
}

または、その場でデータをフィルタリングまたは変換する場合は、 nullキーを獲得します。


留意すべき制限

  • 反復後に巻き戻すことはできません:発電機が消費されると、それは完了します(再作成しない限り)。
  • ランダムアクセスはありません:100番目のアイテムに直接ジャンプすることはできません。
  • 再利用できません:ジェネレーターは、包まれたり再有名である場合を除き、片足です。

例えば:

 $ gen = getNumbers(3);
foreach($ gen as $ n){echo "$ n"; } // 1 2 3
foreach($ gen as $ n){echo "$ n"; } //何も - ジェネレーターはすでに使い果たされています

結論

yieldのあるジェネレーターは、ファイルを読んでいる、データベースのクエリ、またはデータの処理など、大規模なデータセットを効率的に処理するのに最適です。値を怠lazに生成することにより、メモリの使用量を低く、パフォーマンスを高く保つのに役立ちます。

それらを1回ループするためだけに大きな配列を構築するように誘惑されるときはいつでも使用してください。多くの場合、メモリ内のデータセット全体を必要としません。一度に1つのアイテムを1つだけ必要にします。

基本的に:ループしている場合は、降伏を検討してください。

以上がPHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PHPの再帰関数で複雑な問題を解決します PHPの再帰関数で複雑な問題を解決します Aug 02, 2025 pm 02:05 PM

再帰関数は、PHPの複雑な問題を解決するための効果的な方法であり、特にネストされたデータ、数学的計算、および自己類似構造を備えたファイルシステムトラバーサルの処理に適しています。 1.ネストされた配列またはメニュー構造の場合、再帰は任意の深さに自動的に適応し、基底の例(空の子供)を介して終了し、レイヤーごとに拡張できます。 2.要因とフィボナッチ配列を計算する場合、再帰は直感的に数学的定義を実装しますが、素朴なフィボナッチにはパフォーマンスの問題があり、記憶を通じて最適化できます。 3.ディレクトリを通過する場合、再帰は任意のレベルのサブディレクトリに侵入する可能性がありますが、これは反復よりも簡単ですが、スタックオーバーフローのリスクに注意を払う必要があります。 4.再帰を使用する場合、基本ケースに到達可能であることを確認し、無限の呼び出しを避け、深さが大きい場合は、パフォーマンスと安定性を改善するために反復または明示的なスタック置換を使用することを検討する必要があります。したがって、問題に「それ自体が小さい」が含まれている場合

PHPのパスバイレファレンスの理解:パフォーマンスと落とし穴 PHPのパスバイレファレンスの理解:パフォーマンスと落とし穴 Aug 03, 2025 pm 03:10 PM

パスバイバイレファレンスインフロスポーパフォーマンスとlaRgearraysorobjeatsdueTocopy-on-writeandobjecthandles、soitshould-by-referenation-by-referenation by-referenationly-whenyouneedtomodifyorigaluauseabulaiable by-usepassonly-whenyouneedodifyorueは、duulturnulturneTurturneTurturinturinturinturinturinturnulを提供する可能性があります

コールバックの進化:PHP 8.1のファーストクラスコール可能な構文 コールバックの進化:PHP 8.1のファーストクラスコール可能な構文 Aug 03, 2025 am 10:00 AM

php8.1didnotintroducefirst-classcallablesyntax; thisfeatureis compondinphp8.4.1.priortophp8.4、callbackSusedStrings、array、orclos ures、whitheerror-andlackedidesupport.2.php8.1は、エコソシステムウィットナム、繊維、andbettertypingbutdidnotchangecallaを改善しました

PHPで関数過負荷をシミュレートするための手法 PHPで関数過負荷をシミュレートするための手法 Aug 03, 2025 pm 01:12 PM

PHPは、JavaやCのような関数の過負荷をサポートしていませんが、さまざまな手法でシミュレートできます。 1.パラメーターのデフォルト値を設定することにより、デフォルトのパラメーターとオプションパラメーターを使用して、異なる呼び出し方法を実現します。 2。変数長パラメーターリスト(...演算子など)を使用して、パラメーターの数に応じて異なるロジックを実行します。 3.関数内でタイプチェックを実行し、パラメータータイプに従って動作を変更します。 4. PHP8の名前付きパラメーターを使用して、明示的な命名と読みやすさを改善することにより、オプションのパラメーターをスキップします。 5.パラメーターモード分布に基づいて、複雑なシナリオに適したパラメーターの数とタイプを判断することにより、異なる処理関数へのルート。これらの方法にはトレードオフがあり、明確で保守可能なコードを確保するための実際のニーズに従って選択する必要があります。

PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復 PHPジェネレーターと `evelo'キーワードを使用したメモリ効率の高い反復 Aug 03, 2025 am 01:38 AM

PHPジェネレーターを使用してキーワードを獲得して、メモリオーバーフローを防ぐために大きなデータセットを効果的に処理します。 1.ジェネレーターは、降伏値による怠zyな評価を実現し、一度にメモリに1つの値のみを残します。 2。ラインごとのFGETを使用するなど、ラインごとのラインごとの読み取り、ラインまたはCSVファイルの処理などのシナリオに適しています。 3.キー価値ペアの出力をサポートし、キー名を明示的に指定します。 4.メモリフットプリントが低い、簡潔なコード、およびforeachとのシームレスな統合の利点があります。 5.しかし、巻き戻しができない、ランダムアクセスをサポートできず、再利用できず、反復を実行する前に再作成する必要があるなどの制限があります。したがって、大量のデータを通過する必要がある場合、ジェネレーターの使用が優先される必要があります。

機能プログラミングの採用:PHPの高次関数 機能プログラミングの採用:PHPの高次関数 Aug 03, 2025 am 02:12 AM

他の順序ファンションは、他の能力を発揮することを検討します

`__invoke`マジックメソッドを使用してPHPで呼び出し可能なオブジェクトを作成する `__invoke`マジックメソッドを使用してPHPで呼び出し可能なオブジェクトを作成する Aug 06, 2025 am 09:29 AM

the__ invokemagicmethodinpallowsanobjectobecalledasafunction、enableingittoactlikeacallable.2.itis definedautisAndAutisedwhentheobjectisInvokedWithwithSeSaNdargument.3.

PHP閉鎖のマスターと語彙スコーピングの「使用」キーワード PHP閉鎖のマスターと語彙スコーピングの「使用」キーワード Aug 01, 2025 am 07:41 AM

PhpClosures withtheUsewwordENABLELEXCOPINGBYCAPTURINGVARIABLESBARIABLESCOPE.1.CLOSURESAREANONMOUSFUNCTIONSTITSTATCASSEXTERNALVARIABLESVIAUSE.2.BYDEFALUALT、variablesInuseArepassedByValue;

See all articles