16

書き直す機会があれば、書き直しますが、とにかく、現状のコードは次のとおりです。

List<string> foobar;

次に、foobar に一連の文字列を追加します。

count=16777216 で、メモリ不足の制限に達しました。

私の理解では、各文字列は異なるサイズになるということです。確かにデータ(私のデータではありません)を見ると、ほとんどが2文字か3文字です。

c#のリストへのデータの最大制限は何ですか? 最大制限が次のとおりであることを示します。

List の現在の実装に格納できる要素の最大数は、理論的には Int32.MaxValue - 20 億強です。

でも:

CLR の現在の Microsoft 実装では、2 GB の最大オブジェクト サイズ制限があります。(Mono などの他の実装には、この制限がない可能性があります。)

私の例では、1,600 万の結果 * 数バイトですか? タスク マネージャーはギグが使用されていることを示していますが、RAM は 8 ギガあります。

16777216 (2^24) はかなり具体的な値のようです-疑わしい制限のようですが、a)これをバックアップするか、b)それを回避する方法を見つけるためのドキュメントがどこにも見つかりませんか?

どんな助けでも大歓迎です。


いくつかのコード:

List<string> returnList = new List<string>();
SqlDataReader dr; //  executes a read on a database, have removed that part as that bit works fine

  if (dr.HasRows)
  {
      while (dr.Read())
      {
          returnList.Add(dr.GetString(0).Trim());
      }
  }

これは単純化された形式です。OOM 例外の try/catch がいくつかありますが、これが実際のコードであり、私を悩ませています。

4

3 に答える 3

12

64 ビット環境で非常に大きなリストを使用しようとしている場合は、アプリケーション構成で大きなオブジェクトを有効にする必要があります。

http://msdn.microsoft.com/en-us/library/hh285054.aspx

OOM は、Lists/ArrayLists がメモリを割り当てる方法が原因である可能性が高く、境界に達するたびにサイズが 2 倍になろうとします。リストは 2^24 から倍増できません。サイズを事前に指定することで、理論的にはリストのサイズを最大化できます。(つまり 2GB)

于 2012-11-22T23:24:37.507 に答える
1

I've posted what I exactly did here, worth giving it a go. Again steps are:

  1. On each iteration query portion of data using an stored proc
  2. Transfer them
  3. Move to the next portion

    List<string> returnList;
    int index = 0;
    SqlCommand cmd = new SqlCommand("ExampleStoredProc", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    while (true)
    {
        cmd.Parameters.Add(
            new SqlParameter("@index", index));
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.HasRows)
        {
            returnList = new List<string>();
            returnList.Add(dr.GetString(0).Trim());
            //transfer data here
        }
        else
        {
            break;
        }
        index++;
    }
    

and the stored proc should be something like this:

CREATE PROCEDURE ExampleStoredProc
    @index INT
AS
BEGIN
    SELECT * 
    FROM  veryBigTable
    WHERE Id >= (@index *1000) AND Id < ((@index + 1) * 1000)
END
GO

I'll definitely work no matter how many records you have, just the more data you have, longer it'll take to finish.

于 2012-11-22T23:30:49.593 に答える