2010-12-11 9 views
3

私はitems.xmlファイルを持っています。これは、アプリケーションの起動後にメモリにロードされます。 items.xmlの各要素は、タイプItem( "&"の文字列プロパティがわずかです)に変換され、アイテムのリストに追加されます。アイテムリストには、Itemという数千のインスタンスが格納されます。メモリにデータを格納するのは良い方法ですか?

オブジェクトにデータを格納しています(私の例ではItemクラスです)。そのようなデータをメモリに保存する別の方法はありますか?

答えて

7

まず心配を維持し、再使用して独自の文字列でメモリ使用量を削減します

Dictionary<string,string> interner = 
    new Dictionary<string,string>(); 
foreach(Item item in list) { 
    string s, name = item.Name; 
    if(interner.TryGetValue(name, out s)) 
     item.Name = s; 
    else 
     interner.Add(name, name); 
} 

。次に、パフォーマンスについて心配します。アプリケーションのプロファイルを作成し、パフォーマンスに傷つく場所を確認します。それは決してあなたの設定ではないかもしれません。ただし、この領域でパフォーマンスの問題が発生した場合は、アイテムの単一またはサブセットのキーを作成してみてください。この方法で、1つまたは複数の辞書にキーとアイテム(またはアイテムのリスト)を設定して、問題のアイテムへのアクセス時間を短縮することができます。

これらのルックアップ辞書は、オブジェクトのコピーではなくアイテムへの参照のみを格納する点で「安い」ことに注意してください。

+2

評判は何も意味しません...素晴らしい答えカルロ! +1。 – mattmc3

+1

時々私はパフォーマンスがすべてだと思います...思い出してくれてありがとう=] –

1

これは問題ありません.1つのタイプのオブジェクトまたは別のタイプのオブジェクトを使用するので、カスタムオブジェクトは適切なオプションです。

XMLデータをロードしてクエリする方法は他にもあります。たとえば、XDocumentを使用し、Linq to XMLでクエリします。

0

これらのオブジェクトが使用されていることを正確に知らなくても、私は確かに言うことはできませんが、あなたが何を表現するかは完全にOKです。

これらのオブジェクトが(1000ではなく)100,000個ある場合、Listは使用するのに最適なデータ構造にはなりません。これには2つのアプローチがあります。リストとして残しておき、それが問題になったときに対処するか、今すぐ修正してください。

前者はあなたが今行うことができないことを意味しますが、未来の仕事量は不明です。後でデータ構造が変更される可能性がより高くなります。バグが導入される可能性があります)。

後者は、既知の量の作業を意味しますが、将来的には、スケールされたデータ構造を選択しても将来的には機能しません。ただし、時期尚早の最適化には注意が必要です。リストが現在のサイズを超えて大きくならない場合は、この作業を何の利益も得ていません。

5

これは問題ありません。あなたが食べないことを保証している限り、すべてのメモリは問題ありません。私はより大きい数の複雑なシステムのためにこれをしました。

あなたのデータは定期的にリストのインデックス以外の何かによってアクセスされている場合は、たとえば、インデックスに項目を辞書を使用することがありますが:

Dictionary<string, Item> lookup = 
    list.ToDictionary(x => x.Code); 

次にあなたがアクセスすることができます。

Item item = lookup["abc012"]; 

また、文字列の値の多くが繰り返されると、あなた自身のインターナを書くことによっていくらかの時間を節約することができます。機能だけの権利を取得する方法について

+0

いいね! RAMを使ってCPUを使用してください:) –

+0

@Zippoまあ、一度やり直してください。それもきれいにしてください。 –

0

あなたのアイテムは読み取り専用ですか、または変更を処理する必要がありますか?それが読取り専用の場合、これまでのところ皆のアドバイスは問題ありません。あなたのメモリ内のオブジェクトが変更可能な場合は、未解決のまま残されたたくさんの質問があります。

あなたが変更を処理しようとしている場合は、どのようになります:

  1. ...同時アクセスを処理?
  2. ...アイテムリストをXMLドキュメントに同期させますか?
  3. ...誰かが基礎となるXML文書を変更した場合、メモリ内キャッシュを期限切れにしますか?
  4. ...アプリケーションがクラッシュ/再起動したときにデータが失われないようにしますか?

高速アクセスのためにメモリ内オブジェクトを使用することは良い方法であり、私はいつもそれをやります。しかし、データが揮発性であれば、簡単な解決策ではありません。このシナリオでは、ACID準拠データベースを使用する必要があります。

関連する問題