2つのテキストを処理するPHPの効率の問題

WBOY
リリース: 2016-06-20 12:47:46
オリジナル
999 人が閲覧しました

<?php/*==> 1.txt <==a:123b:1333c:333==> 2.txt <==a:3333aa:3433c:323dfa==> result.txt <==a:123:3333c:333:323dfa*/$file_1 = "1.txt";$file_2 = "2.txt";$f = fopen("$file_1", 'r') or die("Cann't Open the file.");while (!(feof($f))) {        $line = explode(':', trim(fgets($f)));        $f2 = fopen("$file_2", 'r') or die("Cann't Open the file.");        while (!(feof($f2))) {                $line2 = explode(':', trim(fgets($f2)));                if ($line[0] == $line2[0]) {                        $line[] = $line2[1];                        $aaaa = implode(":",$line);                        $output_file = fopen("./result.txt", 'a');                        echo "$aaaa\n";                        fwrite($output_file, "$aaaa\n");                        fclose($output_file);                }        }}?>
ログイン後にコピー

コードにあるように、1.txtと2.txtがソートされて新しいファイルresult.txtに出力され、コメント部分のような効果になります。書いたレコード数が少ないときは問題ありませんでしたが、両方のテキストに数十万件のレコードがあった場合、効率が著しく低下し、整理するのに約 10 時間かかりました。私は PHP を初めて使用するので、マスターからの指導を求めています。


ディスカッション (解決策) への返信

$t = file('data/1.txt', FILE_IGNORE_NEW_LINES);foreach($t as $v) {  list($k, $v) = explode(':', $v);  $a[$k][] = $v;}$t = file('data/2.txt', FILE_IGNORE_NEW_LINES);foreach($t as $v) {  list($k, $v) = explode(':', $v);  $b[$k][] = $v;}foreach($a as $k=>$v) {  if(isset($b[$k])) {    file_put_contents('data/result.txt', join(':', array_merge(array($k), $v, $b[$k])). PHP_EOL, FILE_APPEND);  }}
ログイン後にコピー
ログイン後にコピー

ネストされたループはなく、遅すぎません

$t = file('data/1.txt', FILE_IGNORE_NEW_LINES);foreach($t as $v) {  list($k, $v) = explode(':', $v);  $a[$k][] = $v;}$t = file('data/2.txt', FILE_IGNORE_NEW_LINES);foreach($t as $v) {  list($k, $v) = explode(':', $v);  $b[$k][] = $v;}foreach($a as $k=>$v) {  if(isset($b[$k])) {    file_put_contents('data/result.txt', join(':', array_merge(array($k), $v, $b[$k])). PHP_EOL, FILE_APPEND);  }}
ログイン後にコピー
ログイン後にコピー

ネストされたループはなく、遅すぎません



1.txt 2.89M、2.txt 3.12M
実行後のプロンプト:
PHP 致命的なエラー: 許容メモリ サイズ134217728 バイトが使い果たされました (32 バイトを割り当てようとしました)
php.ini の設定は、memory_limit = 128M ですが、一度にすべて使用されてしまいますか?

そんな事が起こり得るでしょうか?ファイルは大きくありません。
他の理由がある可能性があります

これら 2 つのファイルをクラウド ディスクに配置しました

直接、memory_limit = 1024M を設定すると、はるかに高速になります @xuzuning ありがとうございます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート