2017-12-04 3 views
0

マイセットアップ:Parallel.ForEachを使用してC#の - SQLiteの少量のデータを保存絶えず

  • マルチスレッド・アプリケーションでは、40件のスレッドに設定してください。
  • foreachのインデックスをconcurrentbagの各ループに追加します。
  • これがバッグに追加されると、string.joins()と一緒にSQLite Tableに送信されます。 (約14ループ/秒、時にはそれ以上です)。

これは動作しますが、CPUは耐えられません。スパイクを80〜90にして10〜に戻り、ループします。 .CommandTextと.ExeecuteNonQueryAsyncを削除する瞬間、それはほとんど4%を超えています。

Screenshot of the CPU Usage Debug Window

私は、上記の設定を行うなぜ私は閉じたときに、そのループを再開し、再起動するようにHashSetの上で各ループの確認インデックスを格納することで、それは私がするように私はすでにループしているもののインデックスを知っていますそれらをハッシュセットから削除し、それらのインデックスなしでループを続けることができます。

私は何をやっているのですか?

のForEachで実行されるコードのイム:多くの小さな書き込みをスピードアップする

looper_checkedIndexes.Add(Index); 
using (SQLiteCommand command = sqldb.CreateCommand()) { 
    command.CommandText = "UPDATE `timeMachine` SET `indexes`='" + string.Join(",", looper_checkedIndexes) + "' WHERE `config`='" + General["name"].ToString().Replace("'", "\\'") + "'"; 
    command.ExecuteNonQueryAsync(); 
} 
+0

スレッドはすべて独自の接続を持っていますか?そうでない場合、DBアクセスはどのように同期されますか? –

+0

@ CL。あなたが何を意味するのか分かりませんが、sqldbはSQLコネクションです。そして、このコードの前には、OpenAndReturn()を使用して、すべてのシングルループを無意識に開いてオープンしないようにします。 –

+0

いくつの接続オブジェクトがありますか? 1または40? –

答えて

0

最良の方法は、単一のトランザクションにそれらを組み合わせること、および/またはWAL modeを使用することです。

+0

これを行うには、ジャーナルをWALに設定してリッピングさせますか? –

+0

テストしたとき何が起こったのですか? –

+0

私はテストをやっていませんでした。 –

関連する問題