SQLite3の異常終了を回避するには?

解決


ながの  2009-05-13 05:59:03  No: 34374

おたずねします。

Delphi6でSQLite3を組み込んでプログラムを作成中ですが、検索途中でパソコンが電源断となってしまい解決の目処がたちません。どなたか解決方法を教示してくださる方はいないでしょうか。

データベース
  ・bshとmshのテーブル
  ・合計で20万件のデータ
検索条件
  ・ファイルから約1万件を読込み、そのデータでbshとmshを検索する
異常終了
  ・スタートから約400件程度でパソコンが電源断となる
  ・512Mのパソコンで開発しており、メモリの少なさが問題かと考えて2Gのパソコンで動作させても同じ現象となる
  ・bshとmshの検索をコメントアウトすると正常終了となるので、問題は以下の検索箇所にあると思われる

//SELECTでbshのデータの読み出し
function TForm1.BSelectMember(Bseldata: string):integer;
begin
  Result:=0;
  try
    SLTB := SLDB.GetTable('SELECT * FROM bsh WHERE bname LIKE '+'"'+Bseldata+'"');
    Result :=SLTB.Count;
  finally
    SLTB.Free;
  end;
end;

//SELECTでmshのデータの読み出し
function TForm1.MSelectMember(Mseldata: string):integer;
begin
  Result:=0;
  try
    SLTB := SLDB.GetTable('SELECT * FROM msh WHERE mname LIKE '+'"'+Mseldata+'"');
    Result := SLTB.Count;                                        
  finally
    SLTB.Free;
  end;
end;

よろしくお願いします。


HOta  2009-05-13 16:32:24  No: 34375

電源が切れるとは、異常な状態ですね。
一つずつ条件を絞らないと判りませんね。

SQLite3は使ったことがありませんが、これは、SQLite3だけで、直接コマンドを入れても同様になりますか?

また、上記ソースは、Likeは"%"が必要では無かったでしょうか?
SLTB,SLDBの型は何でしょうか?
レコード数を数えるのなら
SELECT Count(*) FROM msh 
を使えばどうでしょう?


ながの  2009-05-14 07:23:17  No: 34376

HOtaさん指摘ありがとうございました。

>上記ソースは、Likeは"%"が必要では無かったでしょうか?
ご指摘の通りです。ただ、テキスト文字列からサブ文字列を探すのが目的ではなく、20文字のデータで20文字のデータを探すことから特に"%"を付けませんでした。
>SLTB,SLDBの型は何でしょうか?
SLTB:TSQLiteTable
SLDB:TSQLiteDatabase
>レコード数を数えるのなら
>SELECT Count(*) FROM mshを使えばどうでしょう?
SELECT Count(*) では、不一致でもカウント=1が返ってきました

SQLite3だけで、直接コマンドを入れてはという件では、元データから1万件のデータを切り出して、連続的に検索させるだけのプログラムを作り動作させたところやはり、電源断となりまりました。

ただ、Vistaで動作させたところ異常なく終了しました。(前回の512Mと2GのパソコンはXP。1万件のデータを連続で検索させるとXPではCPU使用率が100%に張り付いたままですが、Vistaは2CPUのため50%程度の負荷となっていることが、この問題の根幹かなと感じています。(ハードに詳しくないのでこの変の仕組みが分かりませんが・・)

とりあえず、Vistaで動作することから、SQLの問題ではないと判断し、この件については解決とさせていただきます。

今後は、100件単位でインターバルを入れてみようかと考えていますが、有効な解決策をご存じでしたらご教示下さい。ありがとうございました。


ながの  2009-05-17 06:26:43  No: 34377

SQLite3の異常終了に関して質問させていただきましたが、その後の経緯について参考となりうるか分かりませんが、補足説明します。

使用しているSQLite3wrapper(A simple Delphi wrapper for Sqlite 3)
http://www.itwriting.com/blog/a-simple-delphi-wrapper-for-sqlite-3
の投稿欄(トップページの13番の質問)に大量に検索を行った場合に、今回と同様にメモリーリークする旨の文書をみつけました。
ただし、投稿者の改善したプログラムはあくまでもメモリーリークを発生させないための仕組みでレスポンスは犠牲にしています。

結論としては、SQLite3wrapperは当方のように大量検索をする場合には、メモリーリークが発生するので使用を控えるべきかなと思います。(2CPUで大量のメモリーを載せたVistaのみの運用なら可能か・・)

あくまでもwrapperを使用し、大量の検索を連続で行った場合の問題点であるので、それ以外の使用では問題なく使用出来るし、SQLite3自体に問題があるわけではありません。wrapperは使いやすいので次のバージョンでまた検証したいと思います。

最後になりましたが、私は最終的に、SQLiteと同様に組み込み可能なデータベースとしてFirebird Embedded Serverに変更することで私自身の問題を解消することができました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加