2010-09-06 12 views
7

Ich habe wie eine Million Datensätze von jeweils etwa 30 Zeichen über einen Sockel kommen. Kann ich alles in einer einzigen Zeichenfolge lesen? Gibt es ein Limit für die Stringgröße, die ich zuweisen kann?Begrenzung der String-Größe in C++?

Wenn ja, kann ich irgendwie Daten über die Socket-Datensätze nach Datensatz senden und record by record empfangen. Ich weiß nicht die Größe jedes Datensatzes bis zur Laufzeit.

Antwort

16

Ihre erste Frage zu beantworten: Die maximale Größe eines C++ Zeichenfolge von string::max_size gegeben

+4

Obwohl Sie vielleicht erwähnen möchten, dass diese maximale Größe in den meisten Implementierungen im Wesentlichen den gesamten verfügbaren Speicher für den Prozess darstellt. – Omnifarious

+0

Als ich Max_size sah, verwechselte ich es mit der vom Benutzer eingestellten max_size, also ein bisschen hilfreicher, es als ein Programm zu sehen: http://stackoverflow.com/questions/1521281/what-are-the-stl -string-limits? rq = 1 – Nav

2

Es gibt keine offizielle Grenze für die Größe einer Zeichenfolge. Die Software wird Ihr System nach Speicher fragen und es wird, solange es es bekommt, Zeichen zu Ihrem String hinzufügen können.

Der Rest Ihrer Frage ist nicht klar.

1

In der Theorie, nein. Aber gehen Sie nicht 100 GB Speicher zu, da der Benutzer wahrscheinlich nicht so viel RAM haben wird. Wenn Sie std :: strings verwenden, ist die maximale Größe std :: string :: npos.

4

Die einzige praktische Grenze für die Stringgröße in C++ ist Ihr verfügbarer Speicher. Allerdings wird es teuer sein, die Zeichenfolge in der richtigen Größe neu zuzuordnen, wenn Sie weiterhin Daten empfangen (vorausgesetzt, Sie kennen deren Gesamtgröße nicht im Voraus). Normalerweise würden Sie Teile der Daten in einem Puffer fester Größe lesen und in seine natürliche Form (Ihre Datensätze) dekodieren, wenn Sie sie erhalten.

8

std::string::max_size() Sie die theoretische Grenze von der Architektur auferlegt wird zeigen, Ihr Programm unter ausgeführt wird. Abgesehen davon, solange Sie genügend RAM und/oder Festplatten-Swap-Speicherplatz haben, können Sie std::strings von großer Größe haben. Die Antwort auf Ihre zweite Frage ist ja, Sie können Datensatz für Datensatz senden, außerdem können Sie möglicherweise nicht große Datenblöcke gleichzeitig über einen Socket senden - es gibt Grenzen für die Größe eines einzelnen Sendevorgangs. Dass die Größe einer einzelnen Zeichenfolge bis zur Laufzeit nicht bekannt ist, ist kein Problem, sie muss zur Kompilierzeit nicht bekannt sein, um sie über einen Socket zu senden. Wie Sie diese Zeichenfolgen Datensatz für Datensatz tatsächlich senden, hängt davon ab, welche Socket/Netzwerkbibliothek Sie verwenden. Konsultieren Sie die entsprechende Dokumentation.

-1

Wenn wir sprechen über char* Sie sind begrenzt mit smth etwa 2^32 auf 32-Bit-Systemen und mit 2^64 auf (Überraschung) 64-Bit diejenigen

Update: Das ist falsch. Siehe Kommentare

+0

warum downvoting? –

+1

Ich habe nicht downvote, aber ich kann verstehen, wie jemand könnte. Trotz der Nomenklatur kenne ich kein "64-Bit" -System, das tatsächlich annähernd 2^64 Speicher unterstützt. Aktuelle CPU-Designs sind in der Regel auf etwa 2^42 Bytes Speicher begrenzt (und die meisten Motherboards auf weniger als das). –

+0

Es gibt auch das Problem der Speicherfragmentierung - der Adressbereich ist möglicherweise nicht zusammenhängend - und die Frage, ob die interne Buchhaltung von 'operator new' so große Speicherblöcke unterstützen kann. – MSalters

2

Die Größe eines Strings ist nur durch die Menge an Speicher begrenzt, die für das Programm verfügbar ist, es ist eher eine Betriebssystembeschränkung als eine C++ - Einschränkung. C++/C-Zeichenfolgen sind null-terminiert, so dass die Zeichenfolgenroutinen glücklich lange Zeichenfolgen verarbeiten, bis sie eine Null finden.

Auf Win32 ist die maximale verfügbare Speicherkapazität für Daten normalerweise um 2 Gigs.

Sie können beliebig große Datenmengen von einem Socket lesen, aber Sie müssen eine Möglichkeit haben, die Daten, die Sie gerade lesen, abzugrenzen. Es muss ein Ende der Datensatzmarkierung oder -länge geben, das mit den Datensätzen verknüpft ist, die Sie lesen. Verwenden Sie diese Informationen, um die Datensätze zu analysieren. Wollen Sie die Daten wirklich in eine Zeichenfolge einlesen? Was passiert, wenn Sie nicht genügend freien Speicher haben, um die Daten im RAM zu halten? Ich vermute, dass es einen effizienteren Weg gibt, mit diesen Daten umzugehen, aber ich weiß nicht genug über das Problem.

0

Wie wäre es, sie mit einem anderen Format zu senden?

in Ihrem Server: senden (strlen (szRecordServer)); senden (szRecordServer);

in Ihnen Client: recv (cbRecord); allok (szRecordClient); recv (szRecordClient);

und wiederholen Sie dies millionenfach.