C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C# 効率良くデータ更新する方法


(過去ログ 130 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■77051 / inTopicNo.1)  C# 効率良くデータ更新する方法
  
□投稿者/ まさ (6回)-(2015/09/07(Mon) 23:46:13)

分類:[C#] 

効率良くデータの更新する方法を模索しています。
Linq(where、select)を用いて更新処理をするも、あまりに遅くて使い物になりません。
メモリの都合もあり、10万件のリストを他のデータ構造にコピーすることは難しいです。
なにか良いアイデアをいただけないでしょうか?



・約10万件のList<独自クラス>です。
・更新対象レコードは2〜3千です。
・更新する際のキー項目として3つ(int,int,date)あります。
・現在、Linqを用いて更新しています。
 result.where(p=> p.a = 1).where(p=> p.b = 2).where(p=> p.c = 3).Select(p=> p.x = 9)

引用返信 編集キー/
■77053 / inTopicNo.2)  Re[1]: C# 効率良くデータ更新する方法
□投稿者/ shu (777回)-(2015/09/08(Tue) 07:52:55)
No77051 (まさ さん) に返信

マシンスペックにもよりますが最近のものなら
シーケンシャルループで条件に一致するものを更新するぐらいで
よいのではないでしょうか?

Linqは効率よくコーディングする為のものであり処理パフォーマンスを
向上させるためのものではありません。

10万件のリスト=>
  1件辺り500Byteとしても50MByte程度
  1件辺り1KByteとしても100MByte程度
にしかなりませんが
そんなにメモリが厳しいのでしょうか?

引用返信 編集キー/
■77054 / inTopicNo.3)  Re[1]: C# 効率良くデータ更新する方法
□投稿者/ ぶなっぷ (47回)-(2015/09/08(Tue) 10:30:42)
たぶん、遅いのは更新対象データの検索でしょう。
(ListのLinq検索では全件ループ検索になる)
だとすれば、キー項目がはっきりしているなら、ListでなくDictionaryにすると
速くなります。

> ・更新する際のキー項目として3つ(int,int,date)あります。
キー項目3つをメンバに持つクラスを作成し、そのクラスにIEqualityComparerを
実装してDictionaryのキーとするか、

もっと簡単にやるなら、
  string Key = string.Format("{0}\t{1}\t{2}", p.a, p.b, pc);
として、stringキーのDictionaryを作成します。

引用返信 編集キー/
■77065 / inTopicNo.4)  Re[2]: C# 効率良くデータ更新する方法
□投稿者/ ??? (3回)-(2015/09/09(Wed) 09:18:15)
No77054 (ぶなっぷ さん) に返信
> たぶん、遅いのは更新対象データの検索でしょう。
> (ListのLinq検索では全件ループ検索になる)

ボトルネックを回避するため、ListのLinq検索を諦めました。

(1)更新対象をシーケンシャルループで10件処理(shu さん)
(2)更新キーをDictionaryで管理(ぶなっぷ さん)

することにしました。


> string Key = string.Format("{0}\t{1}\t{2}", p.a, p.b, pc);
> として、stringキーのDictionaryを作成します。

新たな発見でした。
複数キーをもつDictionaryは、tupleを用いていましたがこちらの方が良さそうです。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -