Biorąc pod uwagę możliwość przepisywania, chciałbym, ale w każdym razie, jak to stoi kod:Uderzyłem w OutOfMemoryException z listą <string> - czy to jest limit czy coś mi brakuje?
List<string> foobar;
Następnie dodać kilka ciągów foobar.
Przy liczbie = 16777216, osiągnęliśmy limit pamięci.
Rozumiem, że każdy ciąg będzie różnej wielkości. Rzeczywiście patrząc na dane (nie moje dane), większość z nich składa się z 2 lub 3 znaków.
what is the max limit of data into list in c#? wskazuje, że maksymalna granica wynosi:
Maksymalna liczba elementów, które mogą być przechowywane w bieżącym realizacji lista jest teoretycznie Int32.MaxValue - tylko ponad 2 mld.
Jednakże:
W obecnej implementacji Microsoft CLR istnieje 2GB maksymalny limit rozmiaru obiektu. (Jest to możliwe, że inne implementacje, np Mono, nie mają tego ograniczenia.)
W moim przykładzie mam, co, 16 milionów wyników * kilka bajtów? Menedżer zadań pokazuje, że używany jest gig, ale mam 8 gigabajtów pamięci RAM.
16777216 (2^24) wydaje się dość konkretną wartością - podejrzanie przypomina limit, ale nie mogę znaleźć żadnej dokumentacji do a) z powrotem to lub b) znaleźć sposób obejścia go?
Każda pomoc zostanie doceniona.
Niektóre kodu:
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());
}
}
To uproszczona forma, Mam teraz trochę try/catch dla wyjątku OOM, ale jest to rzeczywisty kod, który dając mi żal.
Czy możesz pokazać nam swój kod? –
Wielkość sterty różni się od rozmiaru pamięci RAM, część pamięci RAM jest używana jako sterty, która służy do przechowywania obiektów. http://stackoverflow.com/questions/2325370/c-sharp-increase-heap-size-is-it-possible – CjCoax
@JonSkeet - zaktualizowany o kilka fragmentów, daj mi znać, czy jest coś jeszcze. –