PHPのpdo+mysqlループ挿入効率が極端に低いので解決してください
オフィスオートメーションを実現するために、学生テーブルをデータベースにインポートする小さなものを作成しましたが、問題なく動作しますが、Baidu でインターネットを検索しても解決策が見つかりませんでした。 。
実現したい機能は次のとおりです。 1. インポート中の表示。処理結果を表示したい場合、スクロールバーが常に下に表示され、最新の処理結果が表示されます。以下では、コード内でアンカーポイントの配置を使用しましたが、これは非常に愚かに感じられました~~~ この要件を満たすより良い方法はありますか?
2. インポートするとき、最初の 1500 項目は非常に速くインポートされ、スクロール バーは下までスクロールしました (非常にプロフェッショナルな外観) が、約 1500 項目を過ぎると動かなくなりました。データベースを選択し、stutable からカウント (*) を選択すると、レコードが増加していることがわかりましたが、ページがスタックしているようで、どの接続をクリックしても応答がありません。同時に、データベース内の行数が表示されません。まだまだ成長中~~~。ここ 2 日間、Baidu はこの問題に直面し、InnoDB には行ロックとトランザクションがあるため、MyIsam よりも効率が低いと述べています (ただし、トランザクションが必要であり、複数のプロジェクトが 1 つのサーバー上にあり、mysql エンジンを変更できません)。ストアドプロシージャやイベントを使えばいいという人もいますが、ストレージやイベントを使った場合、リアルタイム処理の効果は現れません。それを解決したい場合は、my.cnf などの設定ファイルを変更できないため、現在のページで解決できることを願っています~~~~
主に 2 番目の問題で、2 日間私を苦しめました、解決してくださいそれ~ ~~~この質問をこのバージョンで投稿するのが良いのか、データベース バージョンで投稿する方が良いのかまだわかりません~~~
コードから始めましょう:
<?phpinclude("conn.php");?><!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>批量导入</title></head><body><table> <thead> <tr><th colspan=2>批量导入学生信息</th></tr> <tr><td>姓名</td><td>导入结果</td></tr> </thead> <tbody><?php//因为导入数据可能占用较长时间,因此设置超时时间为0set_time_limit(0);//将信息写入数据库function addstu($stuname){ global $db; if($db->exec("insert into stutable(stuname) values('".$stuname."')")=="1") { return "导入成功!"; } else { return "导入失败!"; }}//上传部分不写了,只写插入过程if($_POST){ //文件导入 if($_FILES["stuinfo"]["error"]>0) { echo "<tr><td colspan='3'>上传文件出错,错误信息:".$_FILES["stuinfo"]["error"]."</td></tr>"; } else { $extension=pathinfo($_FILES["stuinfo"]["name"],PATHINFO_EXTENSION);//获取上传文件的扩展名 $filename="upload/".time().".".$extension;//上传后的文件名 move_uploaded_file($_FILES["stuinfo"]["tmp_name"],$filename);//将上传的临时文件移动到指定目录 $file=fopen($filename,"r");//打开文件,然后读取信息 $stuinfo=array(); while($data=fgetcsv($file)) { array_push($stuinfo,implode($data)); } fclose($file); } //遍历数组,向数据库insert数据 print str_repeat(" ",4096);//想实现导入的同时显示进度,先输出一堆空字符 foreach($stuinfo as $rs) { $addresult=""; $addresult="<tr><td><a name='".$rs."'></a>".$rs."</td><td>".addstu($rs)."</td><tr>";//直接调用addstu方法向数据库写数据 $addresult.="<script type='text/javascript'>location.href='#".$rs."';</script>";//想实现导入的同时滚动条始终在最下方,想不到别的方法,只得用锚点定位。请问有更好的方法吗? echo $addresult;//输出当前的操作 ob_flush(); flush(); usleep(1000);//当时无论如何都实现不了边导入边显示,后来加了个sleep就行了,百思不解,请指点 }}?> </tbody></table></body></html>
ディスカッションへの返信 (解決策)
InnoDB であろうと MyIsam であろうと、テーブル タイプはテーブル用です
リアルタイム表示メソッドは Web システムの欠陥に基づいて構築されています。別の環境ではまったく効果がない可能性があります
出力したデータ内の tr タグ。が閉じられていない場合でも、問題が発生します。
テーブルの行は table タグ内に出力されますか、それともタグ外に出力されますか?
外だったら明らかに間違ってるよ
ループによる
モデレータのおかげで、より良いものがあります瞬時に表示する方法は?ループ内で「<script>$.get()</script>」をエコーする必要がありますか?これは、PHP ループ内で jq を使用して別のページからデータを送信し、テーブルにレシートを書き込むことを意味しますか?
最も重要な問題はインポート効率です。インポートされたアイテムの数が約 1,500 に達すると、ページは完全にスタックしますが、データベース内の行数は依然として増加しています。ページがフリーズするのは PHP が原因なのか、それともデータベースへのデータの挿入がページをフリーズさせるのかわかりません。
疑問を解決します
一般的に、マークが閉じられていない場合、マークの内容は表示されません
そのため、内容を表示するには table の代わりに div を使用する必要があり、IE の table は読み取り専用です
別の方法 (ajax など) は、現在使用している方法よりも明らかに優れています。少なくとも、項目が挿入されるたびにプログラムを人為的に 1 ミリ秒間ハングさせる必要はありません
解決策はありますか?
このようなニーズの場合、私は通常、フロントエンドの ajax ループリクエストを使用し、毎回 n 回処理し、成功が返された後にページに表示し、再度リクエストします
個人的には、Web は小規模な用途に適していると思いますGPU が CPU を処理できないのと同じように、同時実行性の高いタスク 動作は同じです
このようなニーズには、通常、フロントエンドの ajax ループリクエストを使用し、毎回 n を処理し、正常に返された後にページに表示します、そして再度リクエストします
大量のデータがある場合にこれをテストしました。 、処理されたデータを取得するために jquery を使用し、データが多すぎるとブラウザがフリーズします
フロントエンドのAjaxループリクエストを使用し、毎回nを処理し、正常に返された後にページに表示し、再度リクエストします
個人的には、WebはGPUと同じように、小規模なタスクと高い同時実行性に適していると思いますCPU の計算を処理できません
これをテストしました。大量のデータがある場合、jquery を使用して処理されたデータを取得し、$.append が情報表示を返します。データが多すぎるとフリーズします
有2个需要注意的地方:
不要连续发请求,采用回调的方式,当第一组数据处理+显示完成后,再发起第二组数据的请求
如果数据量太大,就给显示数据条数定个上限,当达到上限时,再有新数据,就先删掉等量的最老的数据
这样做之后肯定不会卡的
如果你的需求就是把上万的数据一并显示在窗口中的话,就要考虑js缓存然后动态变化显示内容了
首先把全部数据保存在js变量中,把前100条打印出来,然后绑定个页面滚动事件,到底了自动刷出来新的100条,把老的删除
归根到底就是不要创建过多DOM元素
估计浏览器把内存都占了。所以后面解释就慢,你创建了太多dom了。
定位到最底可以不用描点实现,可以用js,修改scrolltop=scrollheight来实现。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title></title></head><body><script type="text/javascript">function add(){var now = new Date();var div = document.getElementById('scrolldIV');div.innerHTML = div.innerHTML + 'time_' + now.getTime() + '<br />';div.scrollTop = div.scrollHeight;}</script><span class="notice">请点击“插入一行”按钮,插入最新信息,当出现滚动条时,滚动条将自动保持在底部。</span><br /><div id="scrolldIV" style="overflow:auto; height: 100px; width: 400px; border: 1px solid #999;"></div><input type="button" value="插入一行" onclick="add();"></div></div></body></html>
回复楼上版主,为什么变慢我还是不清楚原因,不知道是因为创建的DOM太多缘故还是PHP代码缘故。
不过我现在的方案是:使用jquery的$().append()方法回显,效果不错。
感谢大家热心回复,结贴

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Python で最小公倍数を見つけるアルゴリズムを作成するにはどうすればよいですか?最小公倍数は、2 つの数値を割り算できる最小の整数です。数学では、最小公倍数を解くことは基本的な数学的タスクであり、コンピューター プログラミングでは、Python を使用して最小公倍数を解くアルゴリズムを作成できます。以下では、基本的な最小公倍数アルゴリズムを紹介し、具体的なコード例を示します。最小公倍数の数学的定義は次のとおりです。 a が n で割り切れ、b が n で割り切れる場合、n は a と b の最小公倍数です。最低限のことを解決するには

Numpy は Python のよく知られた科学計算ライブラリであり、大規模な多次元配列と行列を処理するための豊富な関数と効率的な計算方法を提供します。データ サイエンスと機械学習の世界では、逆行列は一般的なタスクです。この記事では、Numpy ライブラリを使用して逆行列をすばやく解く方法と、具体的なコード例を紹介します。まず、Numpy ライブラリをインストールして Python 環境に導入しましょう。 Numpy は、次のコマンドを使用してターミナルにインストールできます: pipinsta

タイトル: C 言語プログラミングを使用して最大公約数ソリューションを実装する 最大公約数 (Greatest Common Divisor、略して GCD) とは、2 つ以上の整数を同時に除算できる最大の正の整数を指します。最大公約数を解くことは、一部のアルゴリズムや問題解決に非常に役立ちます。この記事では、最大公約数を求める機能をC言語プログラミングで実装し、具体的なコード例を紹介します。 C 言語では、ユークリッド アルゴリズムを使用して最大値を解くことができます。

Python を使用して階乗を解くアルゴリズムを実装するにはどうすればよいですか?階乗は数学における重要な概念です。数値が 1 になるまで、数値そのものを乗算してから 1 を引いたものを乗算し、次にそれ自体を乗算してから 1 を引いた値を乗算することを意味します。階乗は通常「!」という記号で表され、例えば5の階乗は5!と表され、計算式は5!=5×4×3×2×1=120となります。 Python では、ループを使用して単純な階乗アルゴリズムを実装できます。サンプルコードを以下に示します。

C 言語で最大公約数を見つける方法を学ぶには、具体的なコード例が必要です。最大公約数 (Greatest Common Divisor、略して GCD) は、それらを割り切れる 2 つ以上の整数のうち最大の正の整数を指します。最大公約数は、コンピューター プログラミングで、特に分数の処理、分数の簡略化、整数の最も単純な比などの問題を解くときによく使用されます。この記事では、C言語を使って最大公約数を求める方法と具体的なコード例を紹介します。ユークリッドなどの最大公約数を解く方法はたくさんあります。

ここではモジュラー方程式に関連した興味深い問題を見てみましょう。 A と B という 2 つの値があるとします。 (AmodX)=B が成り立つような、変数 X が取り得る値の数を見つけなければなりません。 A が 26 で B が 2 だとします。したがって、X の推奨値は {3,4,6,8,12,24} となり、カウントは 6 になります。これが答えです。よりよく理解するためにアルゴリズムを見てみましょう。アルゴリズム possibleWayCount(a,b) - 開始 ifa=b、その後無限の解がある ifa

フィボナッチ数列は、次の項が前の 2 つの項の合計である数列です。フィボナッチ数列の最初の 2 つの項は 0 で、その後に 1 が続きます。この問題では、フィボナッチ数列の n 番目の数値を求めます。これを行うには、すべての数値を数えて n 個の項目を出力します。入力:8出力:011235813 説明 0+1=11+1=21+2=32+3=5 For ループを使用して、最初の 2 つの項目を次の項目として合計します。 例 #include<iostream>usingnamespacestd;intmain(){ intt1 = 0,t2=1,n,i,nextTerm;&am

タイトル: PHP で 2 のべき乗を解くには? PHP プログラミングでは特定のコード例が共有されており、数値のべき乗を解くことは、特に一部のアルゴリズムや数学的計算において共通の要件です。この記事では、PHP で 2 のべき乗を解く方法について詳しく説明し、参考として具体的なコード例を示します。 PHP では、べき乗演算子 ** を使用してべき乗を計算できます。 2 のべき乗の場合、$2^n$ を計算します。$n$ はべき乗の指数です。以下では、この計算をいくつかの異なる方法で実装します。方法 1: ** 運を利用する
