2017-03-27 3 views
1

List(基本的にint.MaxValue)に追加できる項目の数に制限があることは知っていますが、毎日のシナリオでは100k、500k、100万という妥当な数字は何ですか?リストの妥当な数<string>要素ですか?

私はDataReaderを使用してListに一度に1つの文字列を追加して、その要素をバッチとして処理しています。バッチを大きすぎるとメモリの制限をあまり大きくしないようにしたいと思います。

+5

お使いのマシンと処理の意味によって異なります。あなたのコードのプロフィール – Rob

+4

どのくらいの記憶がありますか?リスト内の文字列の大きさはどれくらいですか?その情報なしであなたの質問にどう答えることができますか? –

+0

答えは常に42です –

答えて

6

もう1つの方法は、リストではなくIEnumerableを返し、yieldキーワードを使用することです。これは、リストのための余分なメモリを消費しません。

public IEnumerable<string> MyBigList(DataReader reader) 
{ 
    while (reader.Read()) 
    { 
     yield return (string) reader["SomeField"]; 
    } 
} 

昔は、イテレータと呼ばれるC#のコルーチンと呼ばれていました。イテレータとyieldの詳細については、MSDNを参照してください。それが依存文字列(複数可)

foreach (var s in MyBigList(reader)) 
{ 
    // do something with s 
} 
1

を処理するために

文字列のカウントサイズの主な考え方は、すべての文字がデフォルトで2バイトのメモリを占有するということです。

いくつかの注意事項:

  • 、リスト内のすべての文字列は、古典小説の全文である場合には、100の項目は確かにいくつかの問題をもたらすことができますが、このリストは平均の正しいスペルの単語の辞書である場合7〜8文字の長さの場合、100KBの文字列は数メガバイトにすぎないので問題にはなりません。
  • リストの数はいくつありますか?単一のインスタンスの場合は、Xバイトのメモリが必要です。しかし、ASP.NETアプリケーションで、すべてのユーザー要求に対してListを作成すると、指数関数的に増加します。
  • 強力なサーバーステーション用のアプリケーションを作成する場合は、複数のギガバイトのキャッシュコレクションが妥当な解決策になる可能性がありますが、システム要件の低いデスクトップクライアントアプリケーションを作成すると、余裕がありません。
  • 多くのスキャン操作(検索)を行い、アイテムの追加と削除、保存、またはファイルシステムからのロードを行うと、すべての操作で操作がO(N)となります。おそらく、あなたの問題に応じて使用されたコレクションの種類を変更したり、データベースを使用したりしたいと考えています。
  • アイテムを1つずつ処理し、コレクションと同様に扱うことを避けると、Listはまったく必要ありません。多くの場合
  • など

、「何List項目の合理的な数がされ、」質問が
ほど重要ではないことは、「これは全くListを使用するための合理的なケースですか?」

メモリ内のダイナミックサイズのプレーンコレクション(List)は、さまざまな使用シナリオでは便利または役に立たない可能性があり、どちらがあなたの場合(特にあなたのコードなし)かわかりません。

関連する問題