PHP で非常に大きなファイルを読み取るサンプルコード

WBOY
リリース: 2016-06-13 12:23:32
オリジナル
986 人が閲覧しました

非常に大きなファイルを読み取るための PHP サンプル コード

大量のデータによって引き起こされる問題は、1 つのファイルが非常に大きいため、メモ帳では開かないことです。決定的にクラッシュしました

昨年末、さまざまなウェブサイトのアカウント情報のデータベースが漏洩したことが非常に印象的でした。私はいくつかのデータベースをダウンロードし、データから学ぶ準備をしました。これらのアカウント情報を分析するアナリスト。このデータ情報は「整理」されていますが、データ量が膨大なので、自分で勉強するのに非常に役立ちます。

大量のデータによって引き起こされる問題は、1 つのファイルが非常に大きいということです。このファイルを開くのは簡単ではありません。メモ帳がクラッシュすることはありません。 MSSQL を使用するクライアントは、このような大きな SQL ファイルを開くことができず、メモリ不足を直接報告します。これは、MSSQL がデータを読み取るときに、データ量が大きすぎると、読み取ったデータを一度にメモリに配置するためであると言われています。メモリ不足はシステムのクラッシュを直接引き起こします。

Navicat Premium
ここでは、非常に強力な、数百メガバイトの SQL ファイルをまったく遅延なく開くことができる、Navicat Premium という推奨ソフトウェアを紹介します。また、このクライアントソフトはMSSQL、MYSQL、Oracleなど様々なデータベースへの接続をサポートしています。その他の機能についても、ゆっくり自分で勉強していきたいと思います。

Navicat を使用して 274MB の SQL ファイル CSDN を開くことはできますが、内容に意味がなく、これらのアカウント情報のクエリ、分類、カウントなどを行うのは不便です。唯一の方法は、データを 1 つずつ読み取り、各レコードの異なるフラグメントを分割し、これらのフラグメントをデータ フィールドの形式でデータベースに保存し、将来便利に使用できるようにすることです。

PHP を使用して非常に大きなファイルを読み取る
PHP では、対象ファイルに応じてさまざまな方法でファイルを読み取ることができ、より適切な方法を採用することで実行効率を効果的に向上させることができます。 CSDN データベース ファイルは非常に大きいため、データを読み取るたびに分割して書き込む必要があるため、短時間ですべてを読み取らないようにしています。そこで、より適切な方法は、ファイルを領域ごとに読み取ることです。PHP の fseek と fread を組み合わせて使用​​すると、ファイル内のデータの特定の部分を自由に読み取ることができます。

代码如下:function readBigFile($filename, $count = 20, $tag = "\r\n") {$content = "";//最终内容$current = "";//当前读取内容寄存$step= 1;//每次走多少字符$tagLen = strlen($tag);$start = 0;//起始位置$i = 0;//计数器$handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件起始位置while($i < $count && !feof($handle)) {fseek($handle, $start, SEEK_SET);//指针设置在文件开头$current = fread($handle,$step);//读取文件$content .= $current;//组合字符串$start += $step;//依据步长向前移动//依据分隔符的长度截取字符串最后免得几个字符$substrTag = substr($content, -$tagLen);if ($substrTag == $tag) { //判断是否为判断是否是换行或其他分隔符$i++;$content .= "<br />";}}//关闭文件fclose($handle);//返回结果return $content;}$filename = "csdn.sql";//需要读取的文件$tag = "\n";//行分隔符 注意这里必须用双引号$count = 100;//读取行数$data = readBigFile($filename,$count,$tag);echo $data; 
ログイン後にコピー


関数で渡される変数 $tag の値についても、システムによって渡される値が異なります。 Windows では "rn" が使用されます。 Linux/UNIX の場合は「n」を使用し、Mac OS の場合は「r」を使用します。

プログラム実行の一般的なプロセス: まず、ファイルを読み取るための基本的な変数をいくつか定義し、次にファイルを開き、ファイルの指定された位置にポインターを置き、指定されたサイズの内容を読み取ります。必要な読み取り行数に達するかファイルの終わりまで、内容を読み取るたびに変数に格納します。

プログラム内のすべてが計画どおりに動作するとは決して考えないでください。

上記のコードによれば、ファイル内の指定した位置とサイズのデータ​​は取得できますが、全体の処理は一度しか実行されず、すべてのデータを取得することはできません。実際、すべてのデータを取得するには、このループの外側の層でファイルが終了するかどうかを判断するループを追加できますが、これはシステム リソースの無駄であり、ファイルが大きすぎるために PHP の実行タイムアウトが発生する可能性もあります。そして最後まで読めない。もう 1 つの方法は、最後にデータが読み取られた後のポインターの位置を記録して保存し、ループが再度実行されるときにポインターを最後の終了位置に配置して、ファイルを読み取るループが存在しないようにすることです。始まりと終わりの状況。

実は、リークの数日後に CNBETA での分析があったため、まだ CSDN データベースをインポートしていません。ははは、アクションが早すぎました。他の人がすでにこれを行っているのを見ると、自動的にそれを行う意欲があまりなくなりますが、学ぶためには、それを完了するのに時間がかかる必要があります。

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