大量のデータによって引き起こされる問題は、1 つのファイルが非常に大きいことです。このファイルを開くのは簡単ではありません。すぐにクラッシュします。
さまざまな Web サイトのアカウント情報が漏洩します。昨年末、私はいくつかのデータベースをダウンロードする機会を得て、これらのアカウント情報を分析する方法をデータ アナリストから学ぶ準備をしたことも非常に印象的でした。このデータ情報は「整理」されていますが、データ量が膨大なので、自分で勉強するのに非常に役立ちます。
番号
大量のデータによって引き起こされる問題は、1 つのファイルが非常に大きく、このファイルを開くのが簡単ではないことです。メモ帳がすぐにフリーズすることは期待できません。 MSSQL クライアントでも、このような大きな SQL ファイルを開くことはできません。
メモリ不足が報告されるのは、MSSQLがデータを読み込む際に、読み取ったデータを一度にメモリに書き込むため、データ量が多すぎてメモリが不足するとシステムのクラッシュに直結するためと言われています。 。
Navicat Premium
Navicat Premium は、非常に強力で、数百メガバイトの SQL ファイルをまったく遅延なく開くことができます。また、このクライアントソフトは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 つの方法は、最後にデータが読み取られた時間を記録して保存することです。
針の位置が決まり、再度ループを実行するとポインタが最後の終了位置に配置されるため、1回のループでファイルを最初から最後まで読み込む必要がありません。
実は、リークの数日後に CNBETA での分析があったため、CSDN データベースをまだデータベースにインポートしていません(笑)、アクションが速すぎました。他の人がすでにこれを行っているのを見ると、自動的にそれを行う意欲があまりなくなりますが、学ぶためには、それを完了するのに時間がかかる必要があります。
上記では、PHP で非常に大きなファイルを読み取るためのサンプル コードを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。