2012-01-20 17 views
0

状況:.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のパフォーマンス比較を歓迎します。誰ですか?

+1

あなたはすべてのトランザクションで膨大な量の行を追加していますか、それとも少し分けていますか?巨大なトランザクションを使用している場合、トランザクションログが問題になることがあります。 –

+0

私はそれについて考えました。しかし、ダンプされた文字列で記述されたテストを行います。そこにあるすべてのもの(コマンドの1000秒、ダンプ文字列自体は約130 MBです)は、1つのトランザクション内にあります。結果は完璧です。 –

+0

申し訳ありませんが、私は何も持っていない:)モバイルプラットフォーム上でsqliteのような大きさのトランザクションを試みたことはありません。 –

答えて

1

私はここ数日間、Mono.Data.Sqliteでいくつかのテストを行ってきましたが、挿入パフォーマンスがひどいことがわかりました。

私は1秒あたり〜14,000個の挿入をC#で見ていますが、C相当では〜38,000個です。これは、1,024,000行を挿入するparamaterised文を使用して、トランザクション内にstring、string、string、string、string、string、DateTimeを挿入したものです。

実際のExecuteNonQueryとCとC#のコメントは、私の場合、毎秒約112,000の反復回数(文字列を生成する)と同じ回数だけ繰り返します。問題はモノがSQLiteを使ってinteropを処理していることから来ています。

これらのテストはMacOSXの下で行われており、これが改善されるかどうかを確認するための有料のモノタッチライセンスがないため、実際のデバイスでは試していません。

+0

それは私が疑っていたことです、ありがとう。私はより多くのテストを行い、結果をここに掲載します。 –

+0

私は反応を約束しましたが、スペースは不十分です。つまり、.Netラッパーのオーバーヘッドは非常に大きく、多くの場合、このオーバーヘッドはSQLite自体よりも多くの時間がかかります。 –

+0

など。バインディング(paramaterisedステートメント)の使用をお勧めします。すべてのパラメータをシリアル化しマーシャリングする必要があります。このプロセスにはいくつかの割り当てが含まれます。要約すると、非paramaterised挿入ステートメントを作成すると、実質的に高速なコードを提供する必要があります。 –

関連する問題