メモリ制限なしでphpで大きなファイルを読み取る方法

3
user3391056 2019-04-01 14:09.

ファイルを1行ずつ読み取ろうとしています。問題は、ファイルが大きすぎて(500000行を超えている)、メモリ制限に達していることです。メモリ制限なしでファイルを読み取る方法を知りたいです。

マルチスレッド(ファイルを小さなグループに分割して(グループごとに100000行)マルチスレッドで読み取るなど)ソリューションについて考えていますが、詳細な方法がわかりません。助けてください(英語が下手でごめんなさい)。

これが私のコードです

$fn = fopen("myfile.txt", "r"); while(!feof($fn)) {
    $result = fgets($fn);
    echo $result; } fclose($fn);

3 answers

8
Mihai Matei 2019-04-01 21:35.

ジェネレータを使用してメモリ使用量を処理できます。これは、ユーザーがドキュメントページに書いた例にすぎません。

function getLines($file) { $f = fopen($file, 'r'); try { while ($line = fgets($f)) { yield $line;
        }
    } finally {
        fclose($f); } } foreach (getLines("file.txt") as $n => $line) {
    // insert the line into db or do whatever you want with it.
}

ジェネレーターを使用すると、メモリ内に配列を作成しなくても、foreachを使用してデータセットを反復処理するコードを記述できます。これにより、メモリ制限を超えたり、生成にかなりの処理時間が必要になる場合があります。代わりに、ジェネレーター関数を作成できます。これは通常の関数と同じですが、ジェネレーターは1回返す代わりに、反復する値を提供するために必要な回数だけ生成できる点が異なります。

2
Tschallacka 2019-04-01 21:31.

私の経験では、スコープがクリアされたときにPHPがメモリを最適にクリーンアップします。ループはスコープとしてカウントされませんが、関数はカウントされます。
したがって、ファイルポインタを関数に渡し、関数内でデータベースの処理を行ってから、ループの関数を終了します。ここで呼び出すことができるgc_collect_cycles()ので、メモリの管理とphpのクリーンアップを強制できます。

また、エコーをオフにすることをお勧めしますが、ファイルにログを記録します。次に、コマンドtail -f filenameを使用してそのログ出力を読み取ることができます(windows linuxサブシステム、Windows bashの場合はgit、またはlinuxの場合)

以下と同様の方法を使用して、数百万のエントリを含む大きなファイルを処理します。これは、メモリ制限を下回るのに役立ちます。

function dostuff($fn) { $result = fgets($fn); // store database, do transforms, whatever echo $result;
}

$fn = fopen("myfile.txt", "r"); while(!feof($fn)) {
    dostuff($fn); flush(); // only need this if you do the echo thing. gc_collect_cycles(); } fclose($fn);
1
Allema_s 2019-04-01 21:39.

readfileとob_get_levelを使用して、メモリと出力バッファリングを管理できます。

readfile()は、大きなファイルを送信する場合でも、それ自体ではメモリの問題を引き起こしません。メモリ不足エラーが発生した場合は、ob_get_level()を使用して出力バッファリングがオフになっていることを確認してください。

読み取りの実行中も、PHP出力バッファリングがアクティブになっている可能性があります。

それを確認してください:

スクリプトの開始時に以下を使用して、すでに開始されている場合は出力バッファリングを停止できます。

if (ob_get_level()) {
  ob_end_clean();
}

Related questions

MORE COOL STUFF

ダイアナ妃は、8歳でウィリアム王子を寄宿学校に送るという決定に「涙を流した」

ダイアナ妃は、8歳でウィリアム王子を寄宿学校に送るという決定に「涙を流した」

ウィリアム王子が 8 歳のときに寄宿学校に通わせたことについて、ダイアナ妃がどのように感じたかを学びましょう。

シャキール・オニールは、レイカーズのスターが彼のチキン帝国を北テキサスに拡大するにつれて、ダラスの外に永住権を購入しました

シャキール・オニールは、レイカーズのスターが彼のチキン帝国を北テキサスに拡大するにつれて、ダラスの外に永住権を購入しました

Shaquille O'Neal は最近、Big Chicken レストラン帝国を拡大するため、ダラス郊外に住居を購入しました。

「90 日間の婚約者」: イヴが逮捕され、浮気スキャンダルの後、モハメドに対する家庭内暴力の容疑に直面している — 何が起こったのか?

「90 日間の婚約者」: イヴが逮捕され、浮気スキャンダルの後、モハメドに対する家庭内暴力の容疑に直面している — 何が起こったのか?

「90日の婚約者」シーズン9のスター、イヴ・アレラーノが逮捕され、モハメド・アブデルハメドへの暴行容疑で家庭内暴力の罪に問われている.

ナターシャ・リオンは、ピーウィー・ハーマンは「ビジネスで最高のGIFを送る」と言います

ナターシャ・リオンは、ピーウィー・ハーマンは「ビジネスで最高のGIFを送る」と言います

ナターシャ・リオンは、ピーウィー・ハーマン自身、ポール・ルーベンスと親密です。彼らの友情について彼女が言ったことを発見してください。

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

2017年に日本で最も売れたゲームは次のとおりです

2017年に日本で最も売れたゲームは次のとおりです

数年前、日本では伝統的なゲームやゲームハードウェアはそれほど熱くありませんでした。それは変わり始めました。

アレックスバローズは、頭の中でテイラーホールをひざまずくために10試合を中断しました

アレックスバローズは、頭の中でテイラーホールをひざまずくために10試合を中断しました

Nils Petter Nilsson / Getty Images Ottawa Senators forward / pest / piece of crap Alexandre Burrowsは、NHLのプレーヤー安全局によって10試合中断されましたが、10試合はまだ簡単に降りたように感じます。火曜日の悪魔との試合中、バローズはテイラーホールからの大ヒットに反応し、ホールを氷にレスリングし、頭の後ろで2回ひざまずきました。バローズは水曜日に電話でのヒアリングを行い(彼は直接のヒアリングを拒否しました)、彼のアピールを検討していると伝えられていますサスペンション。

2017年の最大のビデオゲームの失望

2017年の最大のビデオゲームの失望

今年は意外と良かったものもありました。しかし、多くのことも吸い込まれました。

科学者はなぜトランプがオフィスに立候補するまで待ったのですか?

科学者はなぜトランプがオフィスに立候補するまで待ったのですか?

イラスト:ジム・クック/ギズモード・サイエンスは政治的です。新たに造幣されたトランプ政権が科学との戦争によく似ていることを明らかにし始めたため、ここ数日でこれが明確になりました。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

水門の修理

水門の修理

天王星と海王星の間の領域に向かって宇宙を 3/4 g の低温で航行しながら、私たちは数週間燃え続けていました。Dawson Trawler の科学者が Yggdrasil ポータルと呼んだもの。

美しいもの

美しいもの

女性として、私は通常、関係を築くことをためらっています。私はいつも彼らに負けないように苦労しました。私は誰かと共有したいという衝動と戦わなければなりません。

逃走中の女性からの発信

最も家が必要なときに家のように感じる場所はありません。

逃走中の女性からの発信

私は誰よりも移動しました。父が住んでいた土地には、父が 1 歳馬を折るミニチュアの競馬場がありました。

死にゆく男から学んだ最大の人生の教訓

彼は、私たちが持っているのはこの現在の瞬間だけであることを知るのが遅すぎました。

死にゆく男から学んだ最大の人生の教訓

ブラッドは、カーキ色のショート パンツとポロ シャツを着たまま、白いゴルフ グローブを両手で高く引っ張ったまま、ベッドルームに入ってきました。彼は満面の笑みを浮かべながら、「今年は私の人生で最高の年だったと思います!」と言いました。通常は保守的な消費者である私たちは、通常とは異なることをしました。

Language