2017-03-27 4 views
1

Ich weiß, es gibt Beschränkungen für die Anzahl der Elemente, die zu einer Liste hinzugefügt werden können (im Grunde int.MaxValue), aber was ist eine angemessene Anzahl in einem alltäglichen Szenario zu verwenden - 100k, 500k, 1 Million?Angemessene Anzahl der Liste <string> Elemente?

Ich verwende einen DataReader und füge jeweils einen String zu einer Liste hinzu und bearbeite die Elemente dann als Stapel. Ich möchte sicherstellen, dass ich die Speichergrenzen nicht zu sehr verschiebe, indem ich die Stapel zu groß mache.

+5

Hängt von Ihrer Maschine ab und was Sie meinen, indem Sie sie verarbeiten. Profiliere deinen Code – Rob

+4

Wie viel Speicher hast du? Wie groß sind die Strings in der Liste? Wie können wir Ihre Frage ohne diese Informationen beantworten? –

+0

Die Antwort ist immer 42 –

Antwort

6

Ein anderer Ansatz besteht darin, ein IEnumerable (nicht List) zurückzugeben und das Schlüsselwort yield zu verwenden. Dies wird nicht zusätzlichen Speicher für eine Liste verbrauchen.

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

In den alten Tagen dies eine Co-Routine, in C# seine bezeichnet als Iterator aufgerufen wurde. Weitere Informationen zu Iteratoren und yield finden Sie unter MSDN.

Um die Saite (n)

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

Es hängt zu verarbeiten.

Der Grundgedanke hinter der Größe der Anzahl der Zeichenfolgen ist, dass jedes Zeichen standardmäßig 2 Byte Speicher belegt.

Einige Überlegungen:

  • Wenn jeder Zeichenfolge in einer Liste ein Volltext eines klassischen Romans ist, dann kann sicherlich 100 Artikel einige Probleme mit sich bringen, aber wenn diese Liste ist ein Wörterbuch der korrekt von durchschnittlich geschriebene Wörter 7-8 Zeichen lang, dann sollten 100k Strings kein Problem sein, da es nur ein paar Megabyte ist.
  • Wie viele von Listen werden Sie haben? Wenn es sich um eine einzelne Instanz handelt, benötigt es X Byte Speicher. Wenn es sich jedoch um eine ASP.NET-Anwendung handelt und Sie für jede Benutzeranforderung ein List erstellen, wird es exponentiell anwachsen.
  • Wenn Sie eine Anwendung für eine leistungsstarke Serverstation schreiben, kann die Cache-Sammlung mit mehreren Gigabyte eine vernünftige Lösung sein. Wenn Sie jedoch eine Desktop-Clientanwendung mit niedrigen Systemanforderungen schreiben, können Sie sie sich nicht leisten.
  • Wenn Sie viele Suchvorgänge durchführen (suchen), Elemente hinzufügen und entfernen, speichern oder aus dem Dateisystem laden, wird für jede Operation die Operation O(N) ausgeführt. Wahrscheinlich möchten Sie den verwendeten Sammlungstyp entsprechend Ihrem Problem ändern oder eine Datenbank verwenden.
  • Wenn Sie Elemente einzeln verarbeiten und die Arbeit damit umgehen können, wie bei der Sammlung, dann brauchen Sie überhaupt nicht List.
  • usw.

In den meisten Fällen „Was ist die angemessene Anzahl von List Artikeln“ Frage ist nicht so kritisch wie
„Ist das ein vernünftiger Fall für List überhaupt mit?“.
Dynamische In-Memory-Plain-Sammlungen (d. H. List) können in verschiedenen Anwendungsszenarios nützlich oder nutzlos sein, und wir können nicht wissen, welches Ihr Fall ist (insbesondere ohne Ihren Code).

Verwandte Themen