mysql:11005
From: "KAWAI,Takanori" <"KAWAI,Takanori" <GCD00051@xxxxxxxxxx>>
Date: Wed, 16 Feb 2005 08:19:02 +0900
Subject: [mysql 11005] Re: 大量にinsertするとブルースクリーンになる
川合孝典です。 ----- Original Message ----- From: "naya" <SNA02388@xxxxxxxxxx> To: <ml@xxxxxxxxxx> Sent: Tuesday, February 15, 2005 11:42 PM Subject: [mysql 11001] Re: 大量にinsertするとブルースクリーンになる (中略) > 明日ご教示のもの試してみます。 > insertしたいレコード=1行でつらつら書けばいいんですよね?? まぁそうなんですが... あれは元のデータがおかしいというよりコマンドラインユーティリティーである mysqlのバッファ長の問題じゃないかというだけで、その確認のために DBIを使っただけです。テーブルを丸ごと置き換えるのであれば 一度ファイルを出力しているわけですし、LOAD DATA INFILEを使ったほうが 効率的でしょう。(おそらくPerlを使って置き換える必要もないはず) 下のex1なら1秒足らずだけどex2だと20秒はたっぷりかかります。 PerlでFile::Find,DBIを使って簡単に書くとex3のようにもかけるでしょうけど あらためて見直してみたら DIR /s /b c:\ > c:\file.txt mysql -uhogehoge -e "LOAD DATA INFILE 'c:/file.txt' REPLACE INTO TABLE t_url" url といった2行のバッチでよいのでは? #長いので-eの後ろで改行を入れました。あと-uのユーザ名とかは適当に [ex.1] use strict; print 'START:' . scalar(localtime), "\n"; use constant LOADFILE => 'c:/temp/t1load.txt'; my $sRec = 'SOMEDATA'; open OUT, '>', LOADFILE; for(my $i=0;$i<30_000;$i++) { print OUT "$i\\$sRec\n"; } close OUT; my $sCmd = q{TRUNCATE TABLE t_url;LOAD DATA INFILE '} . LOADFILE . q{' REPLACE INTO TABLE t_url}; system(qq{mysql -uroot -e "$sCmd" test}); print 'END :' . scalar(localtime), "\n"; [ex.2] use strict; print 'START:' . scalar(localtime), "\n"; use DBI; my $hDb = DBI->connect('dbi:mysql:test', 'root', '', {AutoCommit=>1, RaiseError=>1}) or die; $hDb->do('TRUNCATE TABLE t_url'); $hDb->do('LOCK TABLE t_url WRITE'); my $hSt = $hDb->prepare( 'INSERT INTO t_url(fullpath) VALUES(?)'); my $sRec = 'SOMEDATA'; for(my $i=0;$i<30_000;$i++) { $hSt->execute("$i\\$sRec"); } $hDb->do('UNLOCK TABLES'); $hDb->disconnect; print 'END :' . scalar(localtime), "\n"; [ex3] #!/home/bin/perl use strict; use File::Find; use DBI; die "Usage: $0 <対象ディレクトリ>" unless(defined($ARGV[0])); my $hDb = DBI->connect('dbi:mysql:test', 'root', '', {AutoCommit=>1, RaiseError=>1}) or die; $hDb->do('truncate table t_url'); my $hSt = $hDb->prepare( 'INSERT INTO t_url(fullpath) VALUES(?)'); sub prnFile { #ディレクトリは読み飛ばし return if(-d $_); #$File::Find::name); #$_はファイル名 #$File::Find::dirはディレクトリ名 #$File::Find::nameはフルパス my $sPath = $File::Find::name; # $sPath =~ s|/|\\|g; #まぁ好みの問題? $hSt->execute($sPath); } find(\&prnFile, $ARGV[0]); =================================================== 川合 孝典 (Hippo2000) DBI日本語メーリングリスト管理人、Kansai.pm所属 kwitknr@xxxxxxxxxx GCD00051@xxxxxxxxxx http://homepage3.nifty.com/hippo2000/、http://www.hippo2000.info/ perldocの日本語情報ならperldocjp:翻訳してみませんか? http://perldocjp.sourceforge.jp/ ===================================================
10992 2005-02-15 13:58 [naya <SNA02388@xxxxx] 大量にinsertするとブルースクリーンになる 10995 2005-02-15 15:30 ┣[とみたまさひろ <tomm] 10997 2005-02-15 17:34 ┃┗[naya <SNA02388@xxxxx] 10998 2005-02-15 19:09 ┃ ┗[川合孝典 <gcd00051@x] 10999 2005-02-15 22:00 ┃ ┣[Kikuo Taniguchi <ki-] 11000 2005-02-15 22:16 ┃ ┃┣[Kikuo Taniguchi <ki-] 11002 2005-02-15 23:46 ┃ ┃┗[naya <SNA02388@xxxxx] 11003 2005-02-16 05:47 ┃ ┃ ┗[Daiju <d.is.here@xxx] 11001 2005-02-15 23:42 ┃ ┗[naya <SNA02388@xxxxx] -> 11005 2005-02-16 08:19 ┃ ┗["KAWAI,Takanori" <GC] 11007 2005-02-16 13:06 ┃ ┗[naya <SNA02388@xxxxx] 11008 2005-02-16 13:20 ┃ ┗[Daiju <d.is.here@xxx] 10996 2005-02-15 16:34 ┣[Daiju <d.is.here@xxx] 11006 2005-02-16 12:38 ┣[bon <bon@xxxxxxxxxx>] 11025 2005-02-21 13:04 ┗[naya <SNA02388@xxxxx] 【御礼】 Re: 大量にinsertするとブルースクリーンになる 11027 2005-02-21 14:13 ┗[sheep <sheep@xxxxxxx] Re: Windowsのタスクによる任意間隔の実行 11028 2005-02-21 14:59 ┗[naya <SNA02388@xxxxx] (御礼)Re: Windowsのタスクによる任意間隔の実行