[過去ログ] C#, C♯, C#相談室 Part91 [無断転載禁止]©2ch.net (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
985
(1): 810 [sage] 2017/01/29(日) 22:35:39.11 ID:F8/CipCU(1/4) AAS
>>810
810(2): デフォルトの名無しさん [sage] 2017/01/23(月) 00:41:33.95 ID:ft2qOqRV(1/2) AAS
803じゃないけど、

10〜20個くらいのプロパティを持つクラス(ほとんどstring型)の、数百万個単位のインスタンスを処理したい
(現在百数十万個だがデータは日々増えていて、将来的には500万個以上のデータを扱いたい)
データ追加時を除けば1つのデータのプロパティを書き換えることはあまりない
全データを対象に集計や抽出をバリバリやる

今はこのクラスのジェネリックリストでメモリ上に保持していて、XmlSerializerとStreamReader/Writerでロード/セーブしてるけど、
500MB以上のファイル読み書きに十秒単位で時間が掛かるようになってきてしまい、使用メモリも多いときは1GBに届きそうになってきた

個人のPCでも実現出来る範囲で何か工夫して軽量化するとすれば、どういうやり方があるだろうか
データベースを使うと却って重くなる?
です。反応が遅れてすいません。現在は、
クラスのインスタンスの複数のプロパティの値を比較して等価かどうか判定しているのですが
データをリストに追加する際、2種類の等価比較法(IEqualityComparer)を用いています

つまり追加対象のデータのうち、
まず弱い比較(少なめのプロパティだけが一致するか比較)で
既存のリストにないデータの「候補」をざっくりピックアップして、
候補たちに少々時間のかかる処理をかけてから(一部プロパティが書き換えられる)、
次に強い比較(多めのプロパティを比較)で候補の中から真に「新しい」ものをリストに追加しています

PosgresやLocalDBといったデータベースでは、こういうことって簡単にできるんでしょうか
ネット検索してみたところ複数のプロパティを比較すること自体は
UNIQUE制約(?)というので出来そうに思ったんですが、
現在やっているような2段構えの比較法は実現可能なんでしょうか?
994
(2): デフォルトの名無しさん [sage] 2017/01/30(月) 00:07:16.67 ID:YrqXkGEW(1) AAS
>>989
989(3): デフォルトの名無しさん [sage] 2017/01/29(日) 23:27:53.21 ID:F8/CipCU(3/4) AAS
>>988
すいません、「DBから取り出す」という表現が何を指しているのかよくわかりません…

いま思案しているのはデータの集計作業時ではなく登録作業時の話です
各データについて、一部のプロパティの値を確定させるには処理時間がかなり必要になっています

追加登録したいデータたちについて、このプロパティ値をあらかじめすべて確定するのは非常に時間がかかるので
まず弱比較でざっくりと追加可能な候補(プロパティ値を確定しなければならないデータたち)を絞っているのです

今はこんな風にしてます(実際のコードでは日本語変数じゃないです)

候補データリスト = 追加したいデータのリスト.Except(全リスト, new MyClass_WeakComparator()).ToList();

候補データリスト について全プロパティ確定作業; //←重い

全リスト = 全リスト.Union(候補データリスト).ToList();
それだと「弱比較」で一致してしまった物は全部捨ててしまっているがいいのか?
>>985の書き方だと、「弱比較」で一致しても「強比較」で一致しない物があり、
それは書き込むと読める。
まあこの辺はそちらがやればいい話だが。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.056s