Next Page

1

Previous Page

スレッド: 大量クエリをファイルに書き込む

作成日: 03/31/10 08:59 AM

返信: 9

uenii


常連


入会日: 10/20/08

投稿数: 55

大量クエリをファイルに書き込む
03/20/10 4:01 PM

クエリ(10フィールド)をcfloopで変数に加えてそれをcffile(write)しているのですが、5万件のクエリを30分ぐらいかかってしまいます。
大量クエリを高速にファイルに落とす方法ってあるのでしょうか?

よろしくお願いします

uenii

Link | Top | Bottom

sussussu


長老


入会日: 05/31/07

投稿数: 153

Re: 大量クエリをファイルに書き込む
03/20/10 10:21 PM

これはCF使っているとぶつかる壁ですね 笑

cffileはとても低速(お手軽ですが)なので、cf8から追加されたファイル操作の関数を使用すれば改善したと思います。(ちゃんと検証していませんが…)

リファレンス

また、今以上に件数が多くなる想定でしたら処理時間だけでなくメモリ消費量にも注意する必要が出てくるかもしれません。十万件超えるなら部分的にJavaで書いてCFからCreateObject()する方向で考えた方が良いと思います。

----------------
suss:::-D::ussu
----------------

Link | Top | Bottom

uenii


常連


入会日: 10/20/08

投稿数: 55

Re: 大量クエリをファイルに書き込む
03/21/10 10:06 AM

sussussuさん
いつもありがとうございます

cffileする時もなんですけどクエリーをcfloopで変数に入れるだけでも結構時間がかかってしまいますね
FileWrite関数を使用してみたのですが、スピードは変わらずでした。
5万件を一つの変数に入れて運用する事自体が問題なのでしょうか?
初心者な質問ですみません。

uenii

Link | Top | Bottom

sussussu


長老


入会日: 05/31/07

投稿数: 153

Re: 大量クエリをファイルに書き込む
03/21/10 12:26 PM

> 5万件を一つの変数に入れ
件数が多い場合は1レコードずつファイルに書き出す方が効率よいです。
cfloopで変数に入れている箇所で、変数には入れずに直接ファイルに書き出してみてください。

----------------
suss:::-D::ussu
----------------

Link | Top | Bottom

uenii


常連


入会日: 10/20/08

投稿数: 55

Re: 大量クエリをファイルに書き込む
03/21/10 12:49 PM

sussussu様

cffile action(append)でファイル追加という事でしょうか?
システム関数では一行単位に書き出す関数が見当たらないのです。
何度も申し訳ありません。

uenii

Link | Top | Bottom

sussussu


長老


入会日: 05/31/07

投稿数: 153

Re: 大量クエリをファイルに書き込む
03/26/10 11:03 AM

FileOpen()のmode="append"でファイルをオープンしてからFileWrite()関数を使います。

#リファレンスのFileWrite()の項だけ見ると確かに、1行ずつの書き込みができないのかな?と思ってしまいますね。関連項目にFileOpen()が無いし。。

<!--- sample --->
<cfset value="01234567#chr(13)##chr(10)#" />
<cfset c = 20000 />

<!--- 随時書き込む --->
<cfset n = GetTickCount() />
<cfset f = FileOpen("c:\temp\temp_01.txt", "append") />
<cfloop index="i" from="1" to="#c#">
	<cfset FileWrite(f, "#value#") />
</cfloop>
<cfset FileClose(f) />
<cfoutput>1: #GetTickCount()-n#<br /></cfoutput>

#CF8で動くか未検証

----------------
suss:::-D::ussu
----------------

Link | Top | Bottom

uenii


常連


入会日: 10/20/08

投稿数: 55

Re: 大量クエリをファイルに書き込む
03/26/10 3:55 PM

sussussu様ありがとうございます

一瞬で出来ました。
目から鱗でございます(m_m)
本当にありがとうございます。
また初心者な質問をすると思いますがこれに懲りずによろしくお願い申し上げます

uenii

Link | Top | Bottom

sussussu


長老


入会日: 05/31/07

投稿数: 153

Re: 大量クエリをファイルに書き込む
03/26/10 6:50 PM

いえいえ、こちらこそレス遅くなってしまってすみません。

当初は5万件を30分ぐらいとのことでしたが、
変更後はどの位の時間になりましたか?

参考にしたいのでお願いします。:::-D::

----------------
suss:::-D::ussu
----------------

Link | Top | Bottom

uenii


常連


入会日: 10/20/08

投稿数: 55

Re: 大量クエリをファイルに書き込む
03/29/10 6:25 AM

sussussu様

こちらこそ返信が遅れまして失礼しました。
書出し事体は5万件を1.3秒位で書き出せました(驚)

内容的にはXMLを解析して最大フィールド項目を取得して、ブロック単位でレコードに置き換えSQLをファイルに書き出して、MySQL側のバッチ処理でそのSQLファイルを実行という流れでした。

しかし一度書き出してからFile関数でロードして1件単位でinsertした方がファイルからMySQLにinsertするより若干早かったです。
実際にはsussussu様にご教授して頂いた書出しはクリア出来たのですが、DB投入に時間がかかる事が判明しました。8フィールド位のレコードで5万件で8分弱位かかっています。疑問なのですが、これがMySQL5.1のスペックなのでしょうか?SQLServerやオラクルだと一瞬で終わるとか?
何か効果的なSQLの実行方法というかお作法があるのでしょうか?

初心者にはわからない事だらけです。フリーだと誰にも聞けずColdFusion-Style.jpサイト頼りになってしまい。どんどんポストしてしまう事になっています(苦笑)

Link | Top | Bottom

sussussu


長老


入会日: 05/31/07

投稿数: 153

Re: 大量クエリをファイルに書き込む
03/31/10 5:59 PM

> 書出し事体は5万件を1.3秒位で書き出せました(驚)

参考になります。やっぱり全然違いますね。


> SQLをファイルに書き出して、MySQL側のバッチ処理でそのSQLファイルを実行

Insert文を書き出し→実行が遅いということですか。
あまり詳しくないのですが、OracleやSQLServerにはcsvを
インポートする機能がありましたので、MySQLでも
出来るかもしれません。
(単にインポートのコマンドで出来たような気も・・・)
一度調査されてみては如何でしょうか。


> しかし一度書き出してからFile関数でロードして1件単位でinsertした方がファイルからMySQLにinsertするより若干早かったです。

CFから叩いた場合、接続方法も違いますし、書き方によっては
SQLがキャッシュされたりするので、そこら辺の差かと思います。


データや処理の内容、さらには環境にもよりますので、一概に
5万件/8分弱が遅いかどうかは分かりませんが、
こういった処理の場合、色々試してみる価値はあると思いますよ。


> フリーだと誰にも聞けずColdFusion-Style.jpサイト頼りになってしまい。

#私はそろそろフリーターになりそうですが(w
私の意見としては、初心者の小部屋の活気にも繋がると思うので、
問題がきちんと整理された質問であれば
どんどんポストして良いと思いますよ。

有効な回答が得られるかは分かりませんが(^^;

----------------
suss:::-D::ussu
----------------

Link | Top | Bottom

Next Page

1

Previous Page

新規投稿

ログイン して返信して下さい。