状況:.Netクライアントアプリケーション(C#、Mono)がWebサービス(SOAP)からデータをダウンロードし、Sqlite DBに格納します。 DBインターフェイスはSystem.Data.Sqliteで、フードの下にはsqlite3.dllが使用されます。System.Data.Sqlite(C#)対Sqlite(C)のパフォーマンス
DB(130 MB)には、数十のテーブルがあります。 1つのテーブルは特に大きく、DBサイズの90%、つまりBLOB列を含むレコード数は10000です。 (最大値は260Kです)
iPadでのダウンロードは22分かかります。実際のDBへの書き込みをコメントアウトすると11分かかりましたので、DBが約11分かかるようです。 "DB"とは、System.Data.Sqliteの上にいくつかのレイヤーを意味します。まだ詳細を知らない。私が知っているのは、すべてのDBコマンドがトランザクション内にあり、関連するトランザクションがほんの少しあることです。
Sqliteシェルを使用してDBをダンプし、sqlite3_exec()をダンプした文字列で呼び出すCコードを測定すると(このコードは最適ではありません)、私は50秒(iPad)。これは、sqliteのCコードが非常に高速にDBを作成できることを意味します。
もう1つ興味深い問題: ダウンロードはテーブルごとに構成されています。すべてのテーブル(それらのうちのいくつかは数MBあります)は大丈夫です。一度にいくつかの項目(5)にダウンロードを再構成する必要があった最大の表を除きます。この対策がないと、メモリが不足してダウンロードが失敗しました。最も可能性の高い説明はメモリ断片化です。 (モノはGCに問題があり、良いメモリ情報を提供しません)
私の気持ちは、ダウンロードプロセス自体が問題のほんの一部であることです。 DBとほぼ同じサイズをダウンロードします。断片化は問題ではありません。しかし、シングルスレッド組織では待ち時間が増えます。
しかし、私は最大の問題はアプリケーションのデータ処理だと感じています。
- これは、いくつかのプロトコル(HTTP、SOAP、XML)
- データ処理System.Data.Sqlite内とsqlite3.dllを呼び出すを解析する必要があります。これはおそらく割り当て、マーシャリングなどを含んでいるでしょう。
私たちは後でもっとテストをしますが、今私はあなたにアイデアをお尋ねしたいと思います。たとえば、System.Data.Sqliteとraw Sqliteのパフォーマンス比較を歓迎します。誰ですか?
あなたはすべてのトランザクションで膨大な量の行を追加していますか、それとも少し分けていますか?巨大なトランザクションを使用している場合、トランザクションログが問題になることがあります。 –
私はそれについて考えました。しかし、ダンプされた文字列で記述されたテストを行います。そこにあるすべてのもの(コマンドの1000秒、ダンプ文字列自体は約130 MBです)は、1つのトランザクション内にあります。結果は完璧です。 –
申し訳ありませんが、私は何も持っていない:)モバイルプラットフォーム上でsqliteのような大きさのトランザクションを試みたことはありません。 –