r - نظم - طرق ادارة الذاكرة



R: إدارة الذاكرة خلال زمليفنتبارس من ضخمة(> 20GB) الملفات (1)

هنا هو مثال، لدينا النصي إطلاق invoke.sh . invoke.sh ، الذي يدعو R سكريبت ويمرر عنوان ورل واسم الملف كمعلمات ... في هذه الحالة، لقد سبق تحميل ملف الاختبار medsamp2015.xml ووضع في ./data دليل ./data .

  • سيكون من المنطقي إنشاء حلقة في البرنامج النصي invoke.sh وتكرار من خلال قائمة أسماء الملفات الهدف. لكل ملف قمت باستدعاء مثيل R، تحميل البرنامج، معالجة الملف والانتقال إلى التالي.

تحذير: أنا لم تحقق أو تغيير وظيفتك ضد أي ملفات التحميل الأخرى والأشكال. وأود إيقاف تشغيل الطباعة من إخراج إزالة الطباعة () المجمع على الخط 62.

print( cbind(c(rep(v1, length(v2))), v2))
  • انظر: runtime.txt للطباعة.
  • يتم وضع ملفات .csv الإخراج في الدليل ./data .

ملاحظة: هذا مشتق من إجابة سابقة قدمتها لي في هذا الموضوع: الذاكرة R لم يتم إصدارها في ويندوز . آمل أن يساعد على سبيل المثال.

تشغيل النص البرمجي

  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 فيل - 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)

اختبار ملف والإخراج

~ / ديف / ستاكوفيرفلوو / 47162861 / البيانات / medsamp2015.xml

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

وقت التشغيل الإخراج

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

الملف: runtime.txt

بناء على هذا السؤال السابق ( انظر هنا )، وأنا أحاول أن أقرأ في العديد من ملفات شمل كبيرة عبر زمليفنتبارز في حين حفظ العقدة متفاوتة البيانات. العمل مع هذه العينة شمل: https://www.nlm.nih.gov/databases/dtd/medsamp2015.xml .

تستخدم التعليمات البرمجية أدناه زباثسابلي لاستخراج القيم الضرورية وسلسلة من العبارات إذا كانت تجمع القيم بطريقة تتطابق مع القيمة الفريدة (بميد) لكل من القيم غير الفريدة (لاستنام) ضمن سجل - والتي قد يكون هناك كن لا الأسماء الأخيرة. والهدف من ذلك هو كتابة سلسلة من كسف الصغيرة على طول الطريق (هنا، بعد كل 1000 اسم العائلة) لتقليل كمية الذاكرة المستخدمة.

عند تشغيل على مجموعة بيانات كاملة الحجم التعليمات البرمجية بنجاح إخراج الملفات على دفعات، ومع ذلك لا يزال يتم تخزين شيء في الذاكرة التي تتسبب في نهاية المطاف خطأ في النظام مرة واحدة يتم استخدام كافة ذاكرة الوصول العشوائي. لقد شاهدت مدير المهام أثناء تشغيل التعليمات البرمجية ويمكن أن نرى الذاكرة R تنمو مع تقدم البرنامج. وإذا قمت بإيقاف البرنامج منتصف المدى ثم قم بمسح مساحة العمل R، بما في ذلك العناصر المخفية، لا تزال الذاكرة يبدو أن تكون قيد الاستخدام من قبل R. انها ليست حتى اغلاق R هو الذاكرة تحرر مرة أخرى.

تشغيل هذا عدة مرات نفسك وسترى استخدام الذاكرة R تنمو حتى بعد مسح مساحة العمل.

الرجاء المساعدة! ويبدو أن هذه المشكلة شائعة لدى الآخرين الذين يقرؤون في ملفات شمل الكبيرة بهذه الطريقة (انظر على سبيل المثال التعليقات في هذا السؤال ).

قانون بلدي على النحو التالي:

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
)




large-files