Ich lese Hadleys Advanced R-Programmierung und wenn es die Speichergröße für Charaktere diskutiert, sagt es das:
R hat einen globalen String-Pool. Dies bedeutet, dass jede eindeutige Zeichenfolge nur vorhanden ist an einem Ort gespeichert, und daher Zeichenvektoren weniger aufnehmen Speicher als Sie vielleicht erwarten.
Das Beispiel, das das Buch gibt, ist das:
%Vor%Eine der Übungen in diesem Abschnitt besteht darin, diese zwei Zeichenvektoren zu vergleichen:
%Vor% Da die Passage nun angibt, dass R einen globalen String Pool hat und da der Vektor vec
hauptsächlich aus Wiederholungen von zwei Strings ("ba" und "na") besteht, würde ich intuitiv - intuitiv - die Größe von erwarten vec
kleiner als die Größe von str
.
Meine Frage ist also: Wie können Sie die Größe dieser Vektoren im Voraus am genauesten abschätzen?
Der Hauptunterschied liegt an den Zeigern in vec
: Jede der kurzen skalaren Zeichenfolgen (CHARSXPs) muss vom entsprechenden Zeichenfolgenvektor (STRSXP) gezeigt werden. Sie haben etwa 1326 solcher String-Zeiger in vec
, aber nur 51 in str
(ein Zeiger ist wahrscheinlich 8 Bytes auf Ihrer Plattform). Der Pool ist für skalare Zeichenfolgen (auch bekannt als CHARSXP-Cache). Ein anderer nicht offensichtlicher Faktor ist die interne Fragmentierung, z. Auf meinem System nimmt eine skalare Zeichenfolge die gleiche Größe an, unabhängig davon, ob sie null bis sieben Zeichen enthält, eine Zeichenfolge mit acht Zeichen braucht nur mehr und so weiter. Siehe die wiederholten Größen im Folgenden:
unlist(sapply(str, object.size))
[1] 96 96 96 104 104 104 120 120 120 120 120 120 120 120 120 136 136 136 136
[20] 136 136 136 136 152 152 152 152 152 152 152 152 216 216 216 216 216 216 216
[39] 216 216 216 216 216 216 216 216 216 216 216 216 216
Dies sind jedoch Implementierungsdetails des Speichermanagers von R, die sich ändern könnten und in keiner Weise von Benutzerprogrammen abhängig sein sollten - mit einem anderen Objektlayout / Speichermanager könnte str
mehr Platz als vec
verwenden .