Frage

Wir meist neigen, die über beste Praxis folgen.

Hier finden Sie aktuelle String vs String

Aber String werfen konnte OutOfMemoryException auch wenn es genügend Speicher vorhanden ist . Es wirft OOM Ausnahme, weil es „kontinuierlichen Speicherblock“ benötigt.

Einige Links Referenz String OutOfMemoryException

und es gibt viele mehr .....

Wie viele von Ihnen mit diesem Problem konfrontiert oder bewusst und was haben Sie getan, es zu lösen?

Gibt es etwas, ich bin fehlt?

P. S:. Ich war nicht bewusst, diese

Ich habe die Frage umformuliert.

*** Das gleiche mit manueller Verkettung gearbeitet (Ich werde dies überprüfen und aktualisieren SO). Die andere Sache, der Anlass zur Besorgnis gegeben mir war, dass es genügend Speicher im System vorhanden ist. Das ist der Grund, warum ich diese Frage hier aufgeworfenen zu überprüfen, ob ein mit diesem Problem konfrontiert oder es war etwas völlig falsch mit dem Code.

War es hilfreich?

Lösung

Die underyling Zeichenfolge, die Sie erstellen müssen auch einen zusammenhängenden Block von Speicher, weil es als ein Array von Zeichen dargestellt wird (Arrays zusammenhängenden Speicher benötigen). Wenn der String eine OOM Ausnahme wirft woludn't Sie in der Lage sein, die darunter liegenden, ohne ihn zu bauen.

Wenn eine Zeichenfolge die Schaffung eines OOM verursacht, gibt es wahrscheinlich ein ernstes Problem in Ihrer Anwendung.

In Reaktion auf Klarstellung:

Es gibt eine kleine Teilmenge von Fällen, in denen mit einem String ein String Aufbau fehlschlagen, wenn die manuelle Verkettung erfolgreich ist. Manuelle Verkettung wird die genaue Länge erforderlich, um verwendet zwei Strings zu kombinieren, während ein String einen anderen Algorithmus hat Speicher für die Zuteilung. Es ist aggressiver und wird wahrscheinlich mehr Speicher zuzuteilen, als tatsächlich für die Zeichenfolge benötigt.

ein String Verwendung wird auch in einer vorübergehenden Verdoppelung des Speichers zur Folge erforderlich, da die Zeichenkette in einer System.String Form und String gleichzeitig für eine kurze Zeit vorhanden sein.

Aber wenn ein Weg, eine OOM verursacht und der andere nicht, ist es wahrscheinlich immer noch Punkte zu einem ernsteren Problem in Ihrem Programm.

Andere Tipps

Wenn String wird einen OutOfMemoryException in Ihrer speziellen Situation werfen, dann manuelle String-Verkettung zu tun ist nicht eine bessere Lösung; es ist viel schlimmer. Das ist genau das der Fall ist (die Schaffung eines extrem, extrem lange Zeichenfolge), wo String soll verwendet werden. Manuelle Verkettung einer Zeichenfolge dieses große wird oft die Erinnerung nehmen, dass die Schöpfung eines Strings mit String würde.

Wie gesagt, auf einem modernen Computer, wenn die Zeichenfolge ist den Computer aus dem zusammenhängenden Speicher ausgeführt Ihr Design tief ist, zutiefst fehlerhaft. Ich kann mir nicht vorstellen, was Sie möglicherweise, dass eine Zeichenfolge würde schaffen machen könnte, dass groß.

Wie viel Speicher reden wir? Ich rede nicht über die freien oder gesamten Speicher im System, aber wie lange ist die Zeichenfolge Sie verketten?

Ein Speicherüberlauf Ausnahme ist fast immer ein sehr schlechtes Zeichen über Ihren Code, auch wenn es lange ausfällt, bevor der Speicher leer ist tatsächlich, wie Sie aufgrund kontinuierlicher Speicher erlebt habe nicht zur Verfügung steht.

An diesem Punkt sollten Sie wirklich den Code neu strukturieren.

Zum Beispiel sind hier verschiedene Möglichkeiten, um das Problem zu bekämpfen:

  1. nicht so viele Daten im Speicher auf einmal halten Sie, setzen Sie sich auf der Festplatte oder etwas
  2. Break it up, halte eine Liste des Zeichenfolge / Stringbuilders und ihnen nur bis zu einer bestimmten Länge hinzufügen, bevor zu einem neuen Schale, hält das „Dauerspeicher“ Problem in Schach
  3. Umstrukturieren der Algorithmus bauen nicht auf alle
  4. Gigabyte Daten im Speicher auf

Wenn Sie so nah an Ihren Speicher ausgeführt wird begrenzt, dass dies auch ein Anliegen, dann sollten Sie wahrscheinlich über eine andere Architektur denken oder eine beefier Maschine.

Wenn man sich anschaut, wie StringBuilder implementiert ist, werden Sie sehen, dass es tatsächlich ein String verwendet die Daten zu halten (String interne Methoden hat, die StringBuilder an seinem Platz ändern können).

d. sie beide die gleiche Menge an Speicher. Da jedoch StringBuilder automatisch das darunter liegende Array erstrecken und kopieren nach Bedarf, wenn erforderlich (aber eine Verdoppelung der Kapazität), die höchstwahrscheinlich die Ursache für den Fehler aus dem Speicher. Aber wie andere haben bereits beide das erfordert einen kontinuierlichen Speicherblock wies darauf hin,

Nun, die Frage ist eigentlich, warum brauchen Sie mit Streichern arbeiten so lange her? Wenn Sie auf dieses Problem stoßen, mehr als wahrscheinlich, sollten Sie Ihr Konzept ändern.

Diese Probleme betreffen auch die System.String Klasse, so sollte man eher chunk Ihre Eingabe in List und die Daten parallel verarbeiten, die insgesamt erhöhen sollten Leistung, wenn sie richtig geschrieben.

begegnete ich diese Ausnahme mit sehr großen Strings sukzessiven mit verschiedenen Stringbuilders gebaut (das kein Problem verursacht haben sollte, da sie in anonymen Funktionen deklariert wurden), und löste es schließlich durch einen einzelnen String Wiederverwendung außerhalb der anonymen Funktion erklärt.

Ich hatte eine sehr ähnliche Erfahrung, wo ich Strings wurde anhängt, aber vergessen, die String.Format hinzuzufügen. Also:

myStringBuilder.Append("1,""{0}""", someVeryLargeIntVariable)

gewesen sein sollte:

myStringBuilder.Append(String.Format("1,""{0}""", someVeryLargeIntVariable))

Beachten Sie, dass dies mein vb.net Code, fehlgeschlagen. Ich repliziert einen ähnlichen Test in C # mit:

myStringBuilder.Append('a', 1564544656);

vs.

myStringBuilder.Append(string.Format("1,\"{0}\"", 1564544656));

Aber in meinem Fall, vb.net hat mich in Schwierigkeiten b / c der impliziten Konvertierungen (ich konnte nicht parallel die genau gleiches Problem in c #).

Ich hoffe, das hilft jemand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top