パフォーマンスに問題がありますSQLite database (.db)
データベース (.db) の 1,00,000 レコードを更新しようとしていますが、これには約 50 分かかります。遅すぎる。
私のコードは以下のようなものです::
for (int q = 0; q < list.Count; q++)
{
ArrayList castarraylist = new ArrayList();
castarraylist = (ArrayList)(list[q]);
using (var cmd = new SQLiteCommand(con))
using (var transaction = con.BeginTransaction())
{
cmd.Transaction = transaction;
for (int y = 0; y < castarraylist.Count; y++)
{
cmd.CommandText = Convert.ToString(castarraylist[y]);
cmd.ExecuteNonQuery();
}
transaction.Commit();
GC.Collect();
}
}
ここでは、各 castarraylist に 5000 レコードが含まれています。トランザクションでデータベースに更新するもの。ということで20回ループして更新完了。時間を手動で確認している間、5000 レコードの反復ごとに時間を増やしています。お気に入り
1st 5000 records processing time > 1:11 minute
2nd 5000 records processing time > 1:25 minute
3rd 5000 records processing time > 1:32 minute
4th 5000 records processing time > 1:40 minute
5th 5000 records processing time > 1:47 minute
6th 5000 records processing time > 1:52 minute
...
...
...
17th 5000 records processing time > 3:32 minute
18th 5000 records processing time > 3:44 minute
19th 5000 records processing time > 4:02 minute
20th 5000 records processing time> 4:56 minute
なぜこれが起こったのか、私には理解できません。私のソースコードは C# で書かれており、ラップトップの構成はi5 2.6 GHz
, 4 GB RAM
,500 GB HD
です。
以下のように接続しました::
SQLiteConnection con = new SQLiteConnection("Data Source=" + fullPath + ";Version=3;Count Changes=off;Journal Mode=off;Pooling=true;Cache Size=10000;Page Size=4096;Synchronous=off");
(*フルパス - 私のデータベースパスです)
以下のようなテーブルを作成しています...
sqlquery2="Select LINK_ID from RDF_LINK
string createLinkToPoly = "create table temp2 AS " + sqlquery2;
これにより、テーブルが作成され、sqlquery2 によって取得されるレコードが挿入されます。
以下のステートメントは、SQLite で Spatialite を拡張します
ExecuteStatement("select load_extension('spatialite.dll')", con);
私のUpdate
声明は以下のようなものです::
UPDATE temp2 SET GEOM = Transform(LineStringFromText('LINESTRING(4.38368 51.18109,4.38427 51.18165)',4326),32632)WHERE LINK_ID= 53841546
この種の 100000 ステートメントは、異なるスレッドで構築され、挿入されますLIST
最後UPDATE
に上記のコードでステートメントを実行します(現在、Larryが提案したコードを使用しています)