ジェネレーターを使用するには、 rigve> code>キーワードを使用する関数を定義します。 <code> riegs
キーワードが発生するたびに、ジェネレーターは実行を一時停止し、生成価値を返します。次回発電機が呼ばれるとき(例えば、 foreach
ループを使用)、実行は中断された場所から再開します。
ここに1から5:
<code class="php"> function nubenerator(){$ i = 1; $ 1; $ 1; $ 1; $ 1; $ 1; $ 1; }} foreach(numbergenerator()as $ number){echo $ number。 &quot; &quot ;; //出力:1 2 3 4 5} </code>
このジェネレーターは、すべての数値を配列に保存するわけではありません。必要に応じて1つずつ生産します。より複雑なジェネレーターは、ファイル、データベース、またはその他のソースからデータを読み取ることができ、処理されると値が生成され、小さなメモリフットプリントが維持されます。また、からの利回りを使用して反復を別のジェネレーターに委任し、複雑な反復を管理しやすくします。大規模なデータセットを処理する場合、データセット全体を配列にロードすると、重要なメモリを消費する可能性があり、パフォーマンスのボトルネックやメモリの疲労に至る可能性があります。ジェネレーターは、オンデマンドで値を生成し、メモリの使用量を大幅に削減することでこれを回避します。
ジェネレーターの作成と呼び出しの最初のオーバーヘッドは、既存の配列にアクセスするよりもわずかに高い場合がありますが、これは通常、大規模なデータセットのメモリの節約とパフォーマンスの向上と比較して無視できます。データセットのサイズが大きくなるにつれて、パフォーマンスの改善がより顕著になります。さらに、ジェネレーターは怠zyな評価を可能にすることでパフォーマンスを改善できます。計算は、すべてを事前に事前に計算するのではなく、値が実際に要求されたときにのみ実行されます。一度に値を1つずつ生成する能力は、データのごく一部のみがいつでもメモリに保持される必要があることを意味します。これは、大きすぎてRAMに快適に収まることができないデータセットにとって重要です。
たとえば、大きなログファイルの処理を検討してください。ファイル全体を配列にロードする代わりに、ジェネレーターを使用して行ごとにファイルを読み取り、処理できます。各ラインは個別に生成され、ファイル全体がメモリにロードされないようにします。このアプローチは、メモリの消費を劇的に削減し、潜在的なメモリエラーを回避します。同様に、ジェネレーターを使用して、データベース、ネットワークストリーム、またはその他の大規模なデータソースからデータを効率的に処理できます。
このジェネレーターはファイルを開き、 fgets()
を使用して行ごとに読み取り、各行を生成します。 trim()
関数は、先頭/末尾の空白を削除します。すべての行を処理した後、ファイルは閉じられます。これにより、ファイルコンテンツ全体がメモリに保持されます。このアプローチは、ネットワーク接続やデータベースの結果セットなど、他のデータストリームに適応できます。 fgets()
をそれらのソースからデータを読み取るための適切な関数に置き換えることができます。この例の例外
に示すように、エラー処理は、堅牢なストリーム処理に重要です。
以上がPHPのメモリ効率の高い反復にジェネレーターを使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。