最適な保管したデータ構造の高速検索や粘り強さ
-
23-09-2019 - |
質問
シナリオ
私は、以下のいずれかの方法が
public void AddItemSecurity(int itemId, int[] userIds)
public int[] GetValidItemIds(int userId)
当初は思保管の形態:
itemId -> userId, userId, userId
や
userId -> itemId, itemId, itemId
AddItemSecurity
はに基づかなければならないデータを取得します第三者からのAPI GetValidItemIds
がどのように利用したいで行います。
す可能性がある2000年のユーザーは、10百万円ます。項目idの形式:2007123456,2010001234(10桁の数字が一つに。
AddItemSecurity
せを行う超高速で GetValidIds
必要subsecond.ものがあった場合、更新既存の itemId
私は削除する必要がるitemIdユーザーになる。
ようにしているとされていることについて私は、ここには最適です。好ましくはディスク(キャッシュがたいコードの維持を満たしております。
商品をご購入の場合idのが始まり0思ったので作りバイト配列の長さ MaxItemId / 8
ユーザーごとに、true/falseのビットが存在します。この制限は、配列の長さを少し1mbたユーザーとすることのないルックアップなどにかかわらず、全ての更新のリストですによりこれを徹底してい メモリマッピングされたファイル をしました。純4枠組みかもキャッシュとしての機械がRAM)を実施せずにキャッシュの論理です。構文解析のid、剥離の、配列りできます。
のItemId->UserId[]一覧で直列化と直接ディスクと読み書きを通常の FileStream
のための継続のリストdiff場合もあります。
毎回新しいユーザーは追加のリストを更新しましてもこれを行うには毎晩行われます。
質問
べんきみこのアプローチは、あるパスを探るべきでも見ることができますか?私は考えてSQLサーバーを行いません速くなればオーバーヘッドの少なくともだちらを異なるサーバー)ですが、私の想定が間違っています。思想や知見をよろしくお願いいたします。という問題を解決しなくハードウェア)
[更新2010-03-31]
今試SQL server2008を次の条件があります。
- テーブルとカラム(userid,itemid)もInt
- クラスタ化されたインデックスのカラム
- 追加~800.000項目180ユーザーの合計144百万行
- 割り当て4gb ramのためのSQLサーバー
- デュアルコア2.66ghzノート
- ディスクSSD
- 使用SqlDataReaderすべてのitemidのリストアップ
- ループのすべてのユーザー
い実行スレッドでの平均値0.2秒です。ってし第二のスレッドでが0.4秒でもokです。あらしの結果は減少している。を追加する第三のスレッド集テルのすぐ近くは飲食面では貧弱のクエリー最大2seonds.あるスレッドは、4秒、五合目のスパイクのクエリー最大50秒です。
CPUは屋根があっても、一つのねじになります。私の試験アプリは一部によりスピーディーループ、sqlついてご覧いただけます。
つながるのとではな規模です。少なくともしない自分の試験します。あり方を最適化し、データベース、収納intの配列のユーザー毎の代わりに一つのレコードに当たります。この難削除します。
[更新2010-03-31#2]
かったので、迅速試験と同じデータをもとビットメモリマップドファイルです。を行うもかなり良くなったと思います。六スレッドを利回りのアクセス時間0.02s0.06。純粋なメモリです。のマッピングされたファイルをマッピングにより、一工程で、アクセス、その他。としてのsqlベースのた4gbのファイルディスクにした23mb.
解決
しかしながら試験の成績を利用メモリマップドファイルのマーキングの疎ビット(NTFSを用いたコードから NTFS疎ファイルのC#.
Wikipediaいての説明など 疎ファイル です。
の利用疎ファイルがないいう範囲での私のid。場合だけ書idの間2006000000と2010999999のファイルのみの配分625,000バイトからのオフセット250,750,000のファイルです。すべてのスペースがオフセットは平和のファイルシステム。各idとして保存されたセットビットのファイルです。うとして扱われるビット配列になります。場合にはidの配列が急激に変化し、その配分は他のファイルです。
るために取得するidの設定までを行うOSを呼んに割り当てられた部品の疎ファイル、そしてチェック各ビットにdnaの塩基配列を決定した。正確である場合、特定のidの設定が非常に速い。場合は、その外部に割り当てられたブロック、それがない場合は、その内で単一のバイトを読みやビットマスクの場合は、正しいビットが設定されます。
したがって、特定のシナリオにおいて多くのidを確認したいとい速度で、これは最も最適な方法がその場で発音を確認することがでます。
内部のメモリマップドファイルを共有できるJavaとしたのがきっかけもの)を行います。Javaまたは支援のためのメモリマッピングされたファイルWindowsの場合、実施、読み込み/書き込みロジックがかなり明した。
他のヒント
私は本当にあなたが決断を下す前に、あなたは素敵なデータベースを試みるべきだと思います。このような何かを長期的に維持するための課題となります。あなたのユーザーベースは実際には非常に小さいです。 SQL Serverは何の問題もなく、あなたが必要なものを処理することができる必要があります。
2000のユーザーは、それほど悪くはありませんが、10個のミルの関連アイテムをあなたは本当にデータベースにこれを置くことを検討すべきです。 DBが、キャッシングなど、あなたが必要とするすべてのストレージ、持続性、インデックス作成を行うと、彼らは非常によく行います。
また、将来へのより良いスケーラビリティを可能にします。あなたは突然の場所で良いデシベルを持つ設定が二万人のユーザーと数十億に対処する必要がある場合は非問題をスケーリング行います。