Gibt es eine string-Typ mit 8 BIT chars?
Muss ich speichern viel strings im RAM. Aber Sie enthalten keine spezielle unicode-Zeichen, die Sie alle enthält nur Zeichen aus "ISO 8859-1" das ist ein byte.
Nun, ich könnte konvertieren jeden string, in Speicher speichern und konvertieren es zurück zu verwenden .Enthält() und Methoden wie diese, aber das wäre Aufwand (meiner Meinung nach) und langsam.
Gibt es eine string-Klasse, ist schnell und zuverlässig und bietet einige Methoden von der ursprünglichen Klasse string wie .Enthält()?
Muss ich diese speichern mehr strings im Speicher mit weniger RAM verwendet. Oder gibt es einen anderen Weg, es zu tun?
Update:
Danke für deine Kommentare und deine Antwort.
Habe ich eine Klasse, die string-Shops. Dann mit einem Methodenaufruf, die ich brauche, um herauszufinden, ob ich bereits, dass Strings im Speicher. Ich habe über 1000 strings, um herauszufinden,, wenn Sie in der Liste eine zweite. hundert Millionen insgesamt.
Die Durchschnittliche Größe der string über 20 Zeichen. Es ist wirklich der RAM, das interessiert mich.
Ich dachte sogar über komprimieren einige Millionen von Zeichenketten und speichern Sie diese Pakete in den Speicher. Aber dann muss ich entpacken Sie es jedes mal, wenn ich brauche, um auf die Werte zuzugreifen.
Ich auch versucht, ein HashSet, aber der benötigte Speicher war sogar noch höher.
Brauche ich nicht den wahren Wert. Nur um zu wissen, ob der Wert in der Liste. Also, wenn es einen hash-Wert, das kann es, sogar besser. Aber alles was ich gefunden brauchen mehr Speicher als die Reine Zeichenfolge.
Derzeit gibt es keinen plan für die weitere Internationalisierung. So ist es etwas, das ich würde sich, wenn es Zeit ist zu 🙂
Ich weiß nicht, ob die Verwendung einer Datenbank würde es lösen. Ich brauche nicht, um etwas Holen, nur um zu wissen, ob der Wert wurde in der Klasse gespeichert. Und ich brauche, um dies zu tun schnell.
- Sie könnten nur speichern Sie Sie als
byte[]
? Dann können Sie die Verwendung von Array ' sContains
Methode. - wie viel Speicher brauchen Sie?
- Chris bist du absolut sicher, dass mit normalen unicode-Zeichenfolgen treffen würde, die Aufführungen, weil Sie laden müssen, zu viele Saiten?! Ich bin ein bisschen überrascht, wenn Sie wirklich müssen, laden Sie Hunderte oder Tausende von MBs der Saiten, vielleicht ist Ihre Anwendung ist nicht wirklich richtig entwickelt, unabhängig davon, ob Sie ASCII/ANSI oder Unicode. wenn es gibt soooo viele Streicher, vielleicht ein Datenbank-Ansatz wäre gut.
- Diese reeks vorzeitiger Optimierung. Und was passiert, wenn Sie plötzlich brauchen, um zu internationalisieren Ihre app?
- Wenn Sie brauchen, um zu speichern über 1000 strings mit einer durchschnittlichen Länge von 20 Zeichen, Ihre Netto-total ist rund 20 KB mit 1-byte-Zeichen, und um 40KB mit 2-byte-Zeichen. dies ist nicht ein problem. Verwenden Sie die String-Klasse, bewegen sich entlang.
- sorry Lasse, spreche ich nicht über 1000 strings, ich bin die Berechnung in hundert Millionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es sehr unwahrscheinlich, dass Sie gewinnen keine wesentliche Leistung aus dieser. Allerdings, wenn Sie brauchen, um Speicher zu sparen, ist diese Strategie angebracht sein.
Konvertieren
string
zu einembyte[]
für diesen Zweck, verwenden SieEncoding.Default.GetBytes()
[1].Konvertieren
byte[]
zurück zu einemstring
für die Anzeige oder andere string-basierte Verarbeitung, NutzungEncoding.Default.GetString()
.Können Sie Ihren code schöner Aussehen, wenn Sie erweiterungsmethoden definiert
string
undbyte[]
. Alternativ können Sie auch wickeln Sie diebyte[]
in einem wrapper-Typ, und setzen Sie die Methoden dort. Machen diesem wrapper-Typ astruct
, nicht einclass
, sonst entstehen zusätzliche heap-Zuweisungen, die ist, was Sie versuchen zu vermeiden.Ich möchte Sie warnen, obwohl — so verschenken Sie die Möglichkeit, Unicode in Ihrer Anwendung. Sie sollten normalerweise alle Alarmglocken Los gehen jedes mal, wenn Sie denke Sie dies tun müssen. Es ist am besten, wenn Sie die Struktur der code in einer solchen Weise, dass Sie leicht gehen Sie zurück zu
string
wenn der Speicher Größen werden nach oben gegangen sind und der Speicherverbrauch hält ein Problem.[1]
Encoding.Default
gibt den aktuellen 8-bit-Zeichensatz unter dem ausgeführten Betriebssystem. Der Standardwert für diese auf englischsprachigen Windows ist Windows-1252, das ist, was Sie wollen. Für das russische Windows wird es sein, Windows-1251 (Kyrillisch) etc.Als pro-Kommentare, eine grundsätzlich schlechte Idee. Wenn Sie haben, es zu tun, byte[] ist dein Freund. Es gibt keine byte-orientierte Klasse "string" in .NET.
Kasse den string.Praktikant Methode, das könnte Ihnen helfen:
http://www.yoda.arachsys.com/csharp/strings.html
http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_intern_pool
Jedoch Blick auf Ihre Anforderungen, ich denke, Sie sind über engineering-it. Sie haben 1000 strings mit 20 Zeichen = 1000 * 20 * 2 = 40,000 bytes, das ist nicht viel Speicher.
Wenn Sie wirklich eine große Menge, speichern Sie es in eine DB mit einem index. Das wäre viel schneller als alles, was der Durchschnittliche Programmierer mit oben kommen kann.