[pgsql-jp: 38906] Re: 大量のデータの登録時に、メモリ不足エラー
"笹倉 雅和"
sasakura @ technicalunion.co.jp
2007年 10月 29日 (月) 14:18:12 JST
笹倉です。
ご意見、アドバイス、ありがとうございます。
プログラムは、お察しの通りのものです。
以下に、変数名等は変えましたが、プログラムを張り込ませてもらいます。
言語は、PowerBuilderというものですが、関数の内部動作などは、おそらく
察しがつくのではないかと思います。
このプログラムのループが約13万回繰り返されていて、その途中で
エラーが発生しています。
一つ気になる点として、本来なら、SELECTを行い、INSERT又は
UPDATEを行うべきなのかもしれませんが、UPDATEを実行し
実行結果によってINSERTを行うようにしていますが、これは問題
ないでしょうか?
1トランザクションで行う処理が多すぎるが為に発生しているのではないか
とは自分でも思ったので、記載のプログラムのループを、ある条件毎に、10分
の1づつぐらいで、区切ってやるとエラーは発生せずに、処理は正常に終了
しました。この結果からは、処理の量による可能性が高いようなので、
上記UPDATEとINSERTのやり方を変えたとしても、根本的な解決に
はならいような気がします。
処理の量による問題なら、大量のデータを扱う場合、こまめにトランザクションを
分割するしか方法はないのでしょうか?
因みに、みなさんは、大量のデータを扱う場合どうしていますか?
for ll_Index=1 to ll_Rows
ls_Field1 = dw_teiban_update_data.GetItemString(ll_Index, "field1")
ls_Field2 = dw_teiban_update_data.GetItemString(ll_Index, "field2")
・
・
・
ls_Field17 = dw_teiban_update_data.GetItemString(ll_Index, "field17")
update t_tgnet_data
set field1 = :ls_Field1,
field2 = :ls_Field2,
・
・
・
field17 = :ls_Field17
where field1 = :ls_Field1 and
field2 = :ls_Field2 and
field3 = :ls_Field3
using SQLCA ;
if SQLCA.SqlCode = 0 and SQLCA.Sqlnrows = 0 then
// 更新行が0なら
insert into t_tgnet_data
( field1, field2, field3, field4,
・
・
・
field21, field22, field23, field24 )
values (
:ls_Field1, :ls_Field2, :ls_Field3, :ls_Field4,
・
・
・
:ld_Field21, :ld_Field22, 0, :ll_Field24 )
using SQLCA ;
if SQLCA.SqlCode <> 0 then
fx_LogOut("「t_tgnet_data」へデータ登録中にエラーが発生しました " + SQLCA.SqlErrText)
ll_Result = -1
end if
elseif SQLCA.SqlCode <> 0 then
fx_LogOut("「t_tgnet_data」へデータ登録中にエラーが発生しました " + SQLCA.SqlErrText)
ll_Result = -1
end if
if ll_Result = 0 then
// 処理済みフラグオン
update m_teiban_kakaku
set end_flag = 1
where field1 = :ls_Field1 and
field2 = :ls_Field2 and
field3 = :ls_Field3
using SQLCA ;
if SQLCA.SqlCode <> 0 then
fx_LogOut("「m_teiban_kakaku」へ更新フラグ設定中にエラーが発生しました " + SQLCA.SqlErrText)
ll_Result = -1
end if
else
exit
end if
next
TU/笹倉
pgsql-jp メーリングリストの案内