resueltos - la descarga de solidos suspendidos desde una mina de fosfato
Acelerar la carga RData (2)
Para variables tan grandes, sospecho que la mayor parte del tiempo se toma dentro del código C interno ( http://svn.r-project.org/R/trunk/src/main/saveload.c ). Puede ejecutar algunos perfiles para ver si estoy en lo cierto. (Todo lo que hace el código R en la función de load
es verificar que su archivo no esté vacío y que no esté dañado).
Además de leer las variables en la memoria, éstas (entre otras cosas) deben almacenarse dentro de un entorno R.
La única forma obvia de obtener una gran aceleración en la carga de variables sería reescribir el código de forma paralela para permitir la carga simultánea de variables. Esto presumiblemente requiere una reescritura sustancial de las partes internas de R, así que no contenga la respiración para esa característica.
He comprobado varias preguntas relacionadas como esta
¿Cómo cargar datos rápidamente en R?
Estoy citando parte específica de la respuesta más calificada.
Depende de lo que quiera hacer y de cómo procese más los datos. En cualquier caso, la carga desde un objeto binario R siempre va a ser más rápida, siempre y cuando siempre necesite el mismo conjunto de datos. La velocidad límite aquí es la velocidad de su disco duro, no R. La forma binaria es la representación interna del marco de datos en el espacio de trabajo, por lo que ya no es necesaria la transformación.
Realmente pensé eso. Sin embargo, la vida se trata de experimentar. Tengo un archivo de 1.22 GB que contiene un objeto igraph. Dicho esto, no creo que lo que encontré aquí esté relacionado con la clase de objeto, principalmente porque puede cargar (''archivo.RData'') incluso antes de llamar "biblioteca".
Los discos en este servidor son muy buenos. Como puedes consultar en el tiempo de lectura a memoria.
user@machine data$ pv mygraph.RData > /dev/null
1.22GB 0:00:03 [ 384MB/s] [==================================>] 100% `
Sin embargo cuando carga estos datos de R
>system.time(load(''mygraph.RData''))
user system elapsed
178.533 16.490 202.662
Por lo tanto, parece que cargar archivos * .RData es 60 veces más lento que los límites del disco, lo que debería significar que R hace algo mientras "carga".
Tengo la misma sensación al usar diferentes versiones R con hardware diferente, es solo que esta vez tuve paciencia para realizar evaluaciones comparativas (principalmente porque con un almacenamiento de disco tan genial, fue terrible el tiempo que tarda la carga)
¿Alguna idea sobre cómo superar esto?
Después de ideas en respuestas.
save(g,file="test.RData",compress=F)
Ahora el archivo es 3.1GB contra 1.22GB antes. En mi caso, la carga de descomprimir es un poco más rápida (el disco no es mi cuello de botella por mucho)
> system.time(load(''test.RData''))
user system elapsed
126.254 2.701 128.974
La lectura del archivo sin comprimir en la memoria tarda unos 12 segundos, por lo que confirmo que la mayoría del tiempo se invierte en configurar el entorno.
Volveré con los resultados de RDS, suena interesante
Aqui estamos, como hemos comentado.
system.time(saveRDS(g,file="test2.RData",compress=F))
user system elapsed
7.714 2.820 18.112
Y obtengo un 3.1GB como "guardar" sin comprimir, aunque md5sum es diferente, probablemente porque save
también almacena el nombre del objeto
Ahora leyendo ...
> system.time(a<-readRDS(''test2.RData''))
user system elapsed
41.902 2.166 44.077
Entonces, combinar ambas ideas (descomprimir y RDS) se ejecuta 5 veces más rápido. Gracias por tus contribuciones!
save
compresas de forma predeterminada, por lo que se necesita tiempo adicional para descomprimir el archivo. Luego se tarda un poco más en cargar el archivo más grande en la memoria. Su ejemplo pv
es simplemente copiar los datos comprimidos en la memoria, lo que no es muy útil para usted. ;-)
ACTUALIZAR:
Probé mi teoría y fue incorrecta (al menos en mi máquina con Windows XP con 3.3GHz de CPU y 7200RPM HDD). La carga de archivos comprimidos es más rápida (probablemente porque reduce la E / S del disco).
El tiempo extra se gasta en RestoreToEnv
(en saveload.c
) y / o R_Unserialize
(en serialize.c
). Por lo tanto, podría hacer que la carga sea más rápida cambiando esos archivos, o tal vez usando saveRDS
para guardar individualmente los objetos en myGraph.RData
luego de alguna manera usar loadRDS
en múltiples procesos R para cargar los datos en la memoria compartida ...