ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルを使用して非常に大きなファイルを読み取るためのコード例

PHP_PHP チュートリアルを使用して非常に大きなファイルを読み取るためのコード例

WBOY
WBOYオリジナル
2016-07-21 15:20:05693ブラウズ

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

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

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

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


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

コードは次のとおりです:

function readBigFile($filename, $count = 20, $tag = "rn") { $content = "";//最終コンテンツ$current = ""; // 現在読み取った内容が保存されます$step= 1;// 毎回移動する文字数
$tagLen = strlen($tag);// 開始位置
$i = 0;/ /Counter
$ 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++ .= "
";
}
//ファイルを閉じる
fclose($handle);
/ /結果を返す
return $content;
$filename = "csdn.sql";//読み込むファイル
$tag = "n" ;//行区切り文字 ここでは二重引用符を使用する必要があることに注意してください
$count = 100; //行数を読み取ります
$data = readBigFile($filename,$count,$tag);
関数で渡される変数 $tag の値についても、Windows では「rn」、Linux/unix では「n」、Mac OS では「r」と、システムによって渡される値が異なります。

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

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

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

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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/325178.html技術記事昨年末にさまざまな Web サイトで起きたアカウント情報のデータベース流出は非常に印象的でした。私はこの機会にいくつかのデータベースをダウンロードし、これらのアカウント情報を分析する方法をデータ アナリストから学ぶ準備をしました。でも…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。