rapido puedo programa porque pesados pendrive pasar para otro mas grandes grande formatear externo duro disco demasiado copiar como archivos archivo 4gb r xml memory-management xml-parsing large-files

puedo - R: Administración de memoria durante xmlEventParse de archivos enormes(> 20 GB)



porque no puedo pasar archivos a mi usb (1)

Aquí hay un ejemplo, tenemos un script de inicio invoke.sh , que llama a un Script R y pasa la url y el nombre de archivo como parámetros ... En este caso, anteriormente descargué el archivo de prueba medsamp2015.xml y lo coloqué en ./data directorio de ./data .

  • Mi sentido sería crear un ciclo en el script invoke.sh e iterar a través de la lista de nombres de archivo de destino. Para cada archivo invocas una instancia R, descárgala, procesa el archivo y pasa al siguiente.

Advertencia: No verifiqué ni cambié tu función contra ningún otro archivo y formato de descarga. Desactivaría la impresión de la salida quitando la envoltura de impresión () en la línea 62.

print( cbind(c(rep(v1, length(v2))), v2))

  • Ver: runtime.txt para imprimir.
  • Los archivos .csv salida se colocan en el directorio ./data .

Nota: Esto es una derivación de una respuesta anterior proporcionada por mí sobre este tema: memoria R no lanzada en Windows . Espero que ayude a modo de ejemplo.

Iniciar secuencia de comandos

1 #!/usr/local/bin/bash -x 2 3 R --no-save -q --slave < ./47162861.R --args "https://www.nlm.nih.gov/databases/dtd" "medsamp2015.xml"

R Archivo - 47162861.R

# Set working directory projectDir <- "~/dev/stackoverflow/47162861" setwd(projectDir) # ----------------------------------------------------------------------------- # Load required Packages... requiredPackages <- c("XML") ipak <- function(pkg) { new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])] if (length(new.pkg)) install.packages(new.pkg, dependencies = TRUE) sapply(pkg, require, character.only = TRUE) } ipak(requiredPackages) # ----------------------------------------------------------------------------- # Load required Files # trailingOnly=TRUE means that only your arguments are returned args <- commandArgs(trailingOnly = TRUE) if ( length(args) != 0 ) { dataDir <- file.path(projectDir,"data") fileUrl = args[1] fileName = args[2] } else { dataDir <- file.path(projectDir,"data") fileUrl <- "https://www.nlm.nih.gov/databases/dtd" fileName <- "medsamp2015.xml" } # ----------------------------------------------------------------------------- # Download file # Does the directory Exist? If it does''nt create it if (!file.exists(dataDir)) { dir.create(dataDir) } # Now we check if we have downloaded the data already if not we download it if (!file.exists(file.path(dataDir, fileName))) { download.file(fileUrl, file.path(dataDir, fileName), method = "wget") } # ----------------------------------------------------------------------------- # Now we extrat the data tempdat <- data.frame(pmid = as.numeric(), lname = character(), stringsAsFactors = FALSE) cnt <- 1 branchFunction <- function() { func <- function(x, ...) { v1 <- xpathSApply(x, path = "//PMID", xmlValue) v2 <- xpathSApply(x, path = "//Author/LastName", xmlValue) print(cbind(c(rep(v1, length(v2))), v2)) # below is where I store/write the temp data along the way # but even without doing this, memory is used (even after # clearing) tempdat <<- rbind(tempdat, cbind(c(rep(v1, length(v2))), v2)) if (nrow(tempdat) > 1000) { outname <- file.path(dataDir, paste0(cnt, ".csv")) # Create FileName write.csv(tempdat, outname, row.names = F) # Write File to created directory tempdat <<- data.frame(pmid = as.numeric(), lname = character(), stringsAsFactors = FALSE) cnt <<- cnt + 1 } } list(MedlineCitation = func) } myfunctions <- branchFunction() # ----------------------------------------------------------------------------- # RUN xmlEventParse(file = file.path(dataDir, fileName), handlers = NULL, branches = myfunctions)

Archivo de prueba y salida

~ / dev / stackoverflow / 47162861 / data / medsamp2015.xml

$ ll total 2128 drwxr-xr-x@ 7 hidden staff 238B Nov 10 11:05 . drwxr-xr-x@ 9 hidden staff 306B Nov 10 11:11 .. -rw-r--r--@ 1 hidden staff 32K Nov 10 11:12 1.csv -rw-r--r--@ 1 hidden staff 20K Nov 10 11:12 2.csv -rw-r--r--@ 1 hidden staff 23K Nov 10 11:12 3.csv -rw-r--r--@ 1 hidden staff 37K Nov 10 11:12 4.csv -rw-r--r--@ 1 hidden staff 942K Nov 10 11:05 medsamp2015.xml

Salida de tiempo de ejecución

> ./invoke.sh > runtime.txt + R --no-save -q --slave --args https://www.nlm.nih.gov/databases/dtd medsamp2015.xml Loading required package: XML

Archivo: runtime.txt

Sobre la base de esta pregunta anterior ( ver aquí ), estoy tratando de leer en muchos archivos xml grandes a través de xmlEventParse mientras guardo datos que varían en el nodo. Trabajando con esta muestra xml: https://www.nlm.nih.gov/databases/dtd/medsamp2015.xml .

El código siguiente usa xpathSapply para extraer los valores necesarios y una serie de sentencias if para combinar los valores de forma que coincida con el valor único (PMID) de cada uno de los valores no exclusivos (LastName) dentro de un registro, para el cual no sea LastNames. El objetivo es escribir una serie de pequeñas csv en el camino (aquí, después de cada 1000 LastNames) para minimizar la cantidad de memoria utilizada.

Cuando se ejecuta en el conjunto de datos de tamaño completo, el código genera correctamente archivos en lotes, sin embargo, todavía se está almacenando algo en la memoria que eventualmente causa un error del sistema una vez que se utiliza toda la memoria RAM. He observado el administrador de tareas mientras se ejecuta el código y puedo ver cómo la memoria de R aumenta a medida que avanza el programa. Y si detengo el programa a mitad de ejecución y luego borro el espacio de trabajo R, incluidos los ítems ocultos, la memoria todavía parece estar siendo utilizada por R. No es hasta que apago R que la memoria se libera nuevamente.

Ejecute esto algunas veces usted mismo y verá que el uso de la memoria R crecerá incluso después de borrar el área de trabajo.

¡Por favor ayuda! Este problema parece ser común para otros que leen en archivos XML grandes de esta manera (consulte, por ejemplo, los comentarios en esta pregunta ).

Mi código es el siguiente:

library(XML) filename <- "~/Desktop/medsamp2015.xml" tempdat <- data.frame(pmid=as.numeric(), lname=character(), stringsAsFactors=FALSE) cnt <- 1 branchFunction <- function() { func <- function(x, ...) { v1 <- xpathSApply(x, path = "//PMID", xmlValue) v2 <- xpathSApply(x, path = "//Author/LastName", xmlValue) print(cbind(c(rep(v1,length(v2))), v2)) #below is where I store/write the temp data along the way #but even without doing this, memory is used (even after clearing) tempdat <<- rbind(tempdat,cbind(c(rep(v1,length(v2))), v2)) if (nrow(tempdat) > 1000){ outname <- paste0("~/Desktop/outfiles",cnt,".csv") write.csv(tempdat, outname , row.names = F) tempdat <<- data.frame(pmid=as.numeric(), lname=character(), stringsAsFactors=FALSE) cnt <<- cnt+1 } } list(MedlineCitation = func) } myfunctions <- branchFunction() #RUN xmlEventParse( file = filename, handlers = NULL, branches = myfunctions )