Ich habe etwa eine Million Datensätze von jeweils etwa 30 Zeichen, die über einen Socket kommen. Kann ich alles in einer einzigen Zeichenfolge lesen? Gibt es eine Grenze für die String-Größe, die ich zuordnen kann?
Wenn ja, gibt es eine Möglichkeit, Daten über die Socket-Datensätze nach Datensatz zu senden und Datensatz für Datensatz zu empfangen. Ich weiß nicht die Größe jedes Datensatzes bis zur Laufzeit.
Um Ihre erste Frage zu beantworten: Die maximale Größe einer C ++ - Zeichenfolge ist gegeben durch string :: max_size
std::string::max_size()
gibt Ihnen die theoretische Grenze an, die von der Architektur Ihres Programms vorgegeben wird unter. Abgesehen davon können Sie std::strings
der riesigen Größe haben, solange Sie genügend RAM und / oder Festplatten-Swap-Speicherplatz haben.
Die Antwort auf Ihre zweite Frage lautet 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 - die Größe eines einzelnen Sendevorgangs ist begrenzt. 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.
Die einzige praktische Grenze für die Zeichenfolgengröß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.
Es gibt keine offizielle Begrenzung für die Größe einer Zeichenfolge. Die Software wird Ihr System nach Speicher fragen und, solange es es bekommt, wird es in der Lage sein, Ihrem String Zeichen hinzuzufügen.
Der Rest Ihrer Frage ist nicht klar.
Die Größe eines Strings ist nur durch die Menge an Speicher begrenzt, die für das Programm verfügbar ist. Dies 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.
Unter Win32 ist die maximale Speicherkapazität für Daten normalerweise etwa 2 Gig.
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, zu begrenzen. 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.
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.
Wenn wir von char*
sprechen Sie sind mit etw 2 ^ 32 auf 32-Bit-Systemen und mit 2 ^ 64 auf (Überraschung) 64-Bit-Systemen
Update: Das ist falsch. Siehe Kommentare
Tags und Links c++