StringBuilder für die string-Verkettung OutOfMemoryException wirft
Wir meist dazu neigen, um die oben genannten best-practice.
Haben Sie einen Blick auf String vs StringBuilder"
Aber StringBuilder werfen könnte OutOfMemoryException, auch wenn noch genügend Speicherplatz zur Verfügung. Es löst OOM-Ausnahme-da braucht es "continuous block of memory".
Einige links für Referenz
StringBuilder OutOfMemoryException
und es gibt viele mehr.....
Wie viele von Ihnen konfrontiert dieses problem oder bewusst und was hast du gemacht um es zu beheben?
Ist es etwas, was ich bin fehlt?
P. S: ich war mir nicht bewusst.
Ich habe die Frage umformuliert.
*** Das gleiche funktionierte mit manueller Verkettung(ich werde dies überprüfen und aktualisieren, SO). Die andere Sache, die mir das Problem war, dass es genug Speicher im system. Das ist der Grund, warum ich diese Frage hier zu prüfen, ob einer vor das problem, oder es war etwas drastisch falsch mit dem code.
InformationsquelleAutor der Frage rajesh pillai | 2008-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den underyling Zeichenfolge, die Sie erstellen, müssen auch einen zusammenhängenden block von Speicher, da ist es dargestellt als array von chars (arrays erfordern zusammenhängenden Arbeitsspeichers) . Wenn der StringBuilder-Objekt wirft ein OOM-Ausnahme Sie woludn nicht in der Lage sein zu bauen die zugrunde ohne Sie.
Wenn das erstellen einer Zeichenfolge bewirkt, dass ein OOM, es ist wahrscheinlich ein ernsteres Problem in Ihrer Anwendung.
Bearbeiten, die in Reaktion auf Aufklärung:
Gibt es eine kleine Untergruppe von Fällen, in denen Gebäude einen string mit StringBuilder wird scheitern, wenn die manuelle Verkettung gelingt. Die manuelle Verkettung wird die genaue Länge, die erforderlich sind, um zu kombinieren zwei Saiten, während ein StringBuilder-Objekt hat einen anderen algorithmn für die Zuteilung von Speicher. Es ist aggressiver und wird wahrscheinlich mehr Speicher zuzuweisen, als eigentlich notwendig für die Zeichenfolge.
Mit einem StringBuilder-Objekt wird auch Ergebnis in einer temporären Verdoppelung der Speicher erforderlich, da der string wird in ein System.String-form und StringBuilder gleichzeitig für eine kurze Zeit.
Aber wenn man Weg ist, was zu einem OOM ist und der andere nicht, ist es wahrscheinlich immer noch Punkte, um ein ernsteres Problem in Ihrem Programm.
InformationsquelleAutor der Antwort JaredPar
Wenn StringBuilder werfen einen OutOfMemoryException-in Ihrer jeweiligen situation, dann tun die manuelle string-Verkettung ist NICHT eine bessere Lösung; es ist viel schlimmer. Dies ist genau dann der Fall (die Schaffung einer sehr, sehr langen string), wo die Klasse StringBuilder verwendet werden soll. Die manuelle Verkettung von einem string in diesem großen viele Male das Gedächtnis, die Schaffung eines string mit StringBuilder nehmen würde.
Gesagt, auf einem modernen computer, wenn Ihr string ist den Betrieb des Computers aus zusammenhängenden Speicher Ihr design ist tief, zutiefst fehlerhaft. Ich kann mir nicht vorstellen, was könnten Sie eventuell tun würde erstellen Sie eine Zeichenfolge, die große.
InformationsquelleAutor der Antwort TheSmurf
Wie viel Arbeitsspeicher reden wir? Ich spreche nicht von free-oder total-Speicher im system, aber wie lange ist die Zeichenfolge, die Sie sind verketten?
Einem Speicher-überlauf-Ausnahme ist fast immer ein sehr schlechtes Zeichen über Ihren code, auch wenn es nicht lange, bevor der Speicher tatsächlich läuft, wie Sie erlebt habe, die aufgrund der ständigen Speicher nicht verfügbar ist.
An diesem Punkt sollten Sie wirklich die Umstrukturierung der code.
Zum Beispiel sind hier verschiedene Möglichkeiten um das problem zu bekämpfen:
InformationsquelleAutor der Antwort Lasse Vågsæther Karlsen
Wenn Sie mit soclose Ihren Speicher begrenzt, dass dies auch ein Anliegen ist, dann sollten Sie wahrscheinlich denken über eine andere Architektur oder eine kräftiger Maschine.
InformationsquelleAutor der Antwort Kibbee
Wenn man sieht, wie
StringBuilder
implementiert ist, wirst du sehen, dass es tatsächlich nutzt einString
zu halten, die Daten (String
hat interne Methoden, die es ermöglichenStringBuilder
zu ändern).I. e. Sie verwenden beide die gleiche Menge an Speicher. Da jedoch
StringBuilder
wird automatisch verlängern der zugrunde liegenden array und kopieren wie nötig, wenn nötig (aber eine Verdoppelung der Kapazität), das ist wahrscheinlich die Ursache für die out-of-memory-Fehler. Aber wie andere schon hervorgehoben haben beide erfordern einen kontinuierlichen Speicherblock,InformationsquelleAutor der Antwort Brian Rasmussen
Gut, die Frage ist eigentlich, warum brauchen Sie zum arbeiten mit Zeichenfolgen, die zu lang? Wenn Sie stolpern über dieses problem mehr als wahrscheinlich sollten Sie ändern Ihr Konzept.
Diese Problematik betrifft auch die System.String Klasse, so sollte man sich eher Stück Ihre Eingabe in Liste< string> und verarbeiten von Daten parallel, sollte die Erhöhung der Gesamtleistung, wenn richtig geschrieben.
InformationsquelleAutor der Antwort arul
Dass ich auf diese Ausnahme mit sehr großen strings gebaut sucessively mit verschiedenen stringbuilders (das sollte nicht zum problem geführt haben, wie Sie deklariert wurden, innerhalb von anonymen Funktionen), und schließlich löste es durch die Wiederverwendung einer einzelnen StringBuilder, erklärt außerhalb der anonymen Funktion.
InformationsquelleAutor der Antwort Erwin Mayer
Ich hatte ein sehr ähnliches Erlebnis, wo ich war, anfügen von strings, aber vergessen, fügen Sie die Zeichenfolge.Format. Also:
gewesen sein sollte:
Beachten Sie, dass dies meine vb.net code, ist fehlgeschlagen. Ich replizierte einen ähnlichen test in c# mit:
vs.
Aber in meinem Fall, vb.net bekam mich in Schwierigkeiten b/c des impliziten Konvertierungen (ich konnte nicht parallel zu den genaue gleiche problem in c#).
Ich hoffe, dass jemand hilft.
InformationsquelleAutor der Antwort archangel76