R - ¿Por qué agregar 1 columna a la tabla de datos casi duplica la memoria máxima utilizada?

Después de conseguirayuda de 2 caballeros amables, logré cambiar a las tablas de datos desde el marco de datos + plyr.

La situación y mis preguntas

Mientras trabajaba, noté queuso pico de memoria casi se duplicó de 3.5GB a 6.8GB (según el Administrador de tareas de Windows) cuando agregué 1 columna nueva usando:= a mi conjunto de datos que contiene ~ 200K filas por 2.5K columnas.

Luego probé 200M por 25 col, el aumento fue de 6GB a 7.6GB antes de caer a 7.25GB después de ungc().

Específicamente con respecto a la adición de nuevas columnas, Matt Dowle mismo mencionóaquí ese:

Con su operador: = puedes:

Add columns by reference
Modify subsets of existing columns by reference, and by group by reference
Delete columns by reference

Ninguna de estas operaciones copia la tabla de datos (potencialmente grande), ni siquiera una vez.

Pregunta 1: ¿por qué agregar una sola columna de 'NA' para un DT con columnas de 2.5K?doble ¿la memoria máxima utilizada si data.table no se copia en absoluto?

Pregunta 2: ¿Por qué la duplicación no ocurre cuando el DT es 200M x 25? No incluí la pantalla de impresión para esto, pero siéntase libre de cambiar mi código e intentarlo.

Imprime pantallas para el uso de memoria usando el código de prueba

Reinicio limpio, RStudio y MS Word abiertos - 103MB usados

Después de ejecutar el código de creación de DT pero antes de agregar la columna: se utilizan 3,5 GB

Después de agregar 1 columna llena de NA, pero antes de gc () - 6.8GB usado

Después de ejecutar gc (): se utilizan 3,5 GB

Código de prueba

Para investigar, hice el siguiente código de prueba que imita estrechamente mi conjunto de datos:

library(data.table)
set.seed(1)

# Credit: Dirk Eddelbuettel's answer in 
# https://stackoverflow.com/questions/14720983/efficiently-generate-a-random-sample-of-times-and-dates-between-two-dates
RandDate <- function(N, st="2000/01/01", et="2014/12/31") { 
  st <- as.POSIXct(as.Date(st))
  et <- as.POSIXct(as.Date(et))
  dt <- as.numeric(difftime(et,st,unit="sec"))
  ev <- runif(N, 0, dt)
  rt <- as.character( strptime(st + ev, "%Y-%m-%d") )
}

# Create Sample data
TotalNoCol <- 2500
TotalCharCol <- 3
TotalDateCol <- 1
TotalIntCol <- 600
TotalNumCol <- TotalNoCol - TotalCharCol - TotalDateCol - TotalIntCol
nrow <- 200000

ColNames = paste0("C", 1:TotalNoCol)

dt <- as.data.table( setNames( c(

  replicate( TotalCharCol, sample( state.name, nrow, replace = T ), simplify = F ), 
  replicate( TotalDateCol, RandDate( nrow ), simplify = F ), 
  replicate( TotalNumCol, round( runif( nrow, 1, 30 ), 2), simplify = F ), 
  replicate( TotalIntCol, sample( 1:10, nrow, replace = T ), simplify = F ) ), 

    ColNames ) )

gc()

# Add New columns, to be run separately
dt[, New_Col := NA ]  # Additional col; uses excessive memory?

Investigación realizada

No encontré demasiada discusión sobre el uso de memoria para DT con muchas columnas, soloesta pero incluso entonces, no se trata específicamente de la memoria.

La mayoría de las discusiones sobre el uso de grandes conjuntos de datos + memoria involucra DT con un gran número de filas pero relativamente pocas columnas.

Mi sistema

Intel i7-4700 con 4 núcleos / 8 hilos; 16 GB de RAM DDR3-12800; Windows 8.1 de 64 bits; 500GB 7200rpm HDD; R de 64 bits; Tabla de datos ver 1.9.4

Renuncias

Perdóname por usar un método 'no R' (es decir, el Administrador de tareas) para medir la memoria utilizada. La medición / creación de perfiles de memoria en R es algo que todavía no he descubierto.

Edición 1: después de actualizar a la tabla de datos ver 1.9.5 y volver a ejecutar. El problema persistió, desafortunadamente.

Respuestas a la pregunta(1)

Su respuesta a la pregunta