Objektgröße für Zeichen in R - Wie funktioniert R Global String Pool?

8

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?

    
Carlos Cinelli 17.04.2015, 14:15
quelle

1 Antwort

1

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 .

    
Tomas Kalibera 28.02.2018 23:34
quelle

Tags und Links