2016-06-20 2 views
0

Я пытаюсь разобрать тысячи файлов в каталоге. Я написал этот скрипт, чтобы подумать о каждом файле, но моя система выходит из памяти. Как еще я могу обрабатывать эти файлы?как вы обрабатываете много файлов без исчерпания памяти в R

dir_path<-c("C:/Documents/Data") 
input_files <- list.files(path = input_path, pattern = "htm", full.names = TRUE) 
nn = length(input_files) 
total_data = data.table(server = as.character(), time = as.character()) 
for(i in 1:nn) 
    { 
    xmlobj = xmlTreeParse(file = input_files[i], isHTML = T) 
    r = xmlRoot(xmlobj) 
    server = xmlValue(r[[2]][1][1]$h1) 
    time = xmlValue(r[[2]][4][1]$dl[1]$dt) 
    web_data = rbind(web_data, data.frame(server, time)) 
    total_data<-rbind(web_data, total_data) 
    gc() 

    } 

Каждый файл, который я читаю, имеет этот контент. Файлы в формате HTM:

Сервер Apache статуса для webserver101

Server Version: IBM_HTTP_Server/7.0.0.39 (Unix) 
Server Built: Aug 3 2015 17:29:08 

Current Time: Sunday, 05-Jun-2016 13:56:27 EDT 
Restart Time: Saturday, 04-Jun-2016 23:06:02 EDT 
Parent Server Generation: 0 
Server uptime: 14 hours 50 minutes 24 seconds 
Total accesses: 39855 - Total Traffic: 1.2 GB 
CPU Usage: u814.13 s13.33 cu0 cs0 - 1.55% CPU load.746 
requests/sec - 24.2 kB/second - 32.5 kB/request7 
requests currently being processed, 73 idle workers 
+1

Что вы делаете после того, как вы обработали файл? –

+0

@Zheyuan, я читаю каждый файл и вынимаю то, что хочу, и формирую фрейм данных и продолжаю добавлять данные из каждого файла в фрейм данных. Это должно работать, но в моей системе не хватает памяти. – user1471980

+1

Ну, насколько большой ваш объект data.frame? Между тем есть пакеты, предназначенные для записи больших объектов для прозрачного файла; вы можете отследить их. –

ответ

2

Вы можете попытаться импортировать все файлы в списке, а затем обработка списка:

all_files <- lapply(input_files, xmlTreeParse, isHTML=TRUE) 
process_files <- lapply(all_files, function(myfile){ 
    r = xmlRoot(xmlobj) 
    server = xmlValue(r[[2]][1][1]$h1) 
    time = xmlValue(r[[2]][4][1]$dl[1]$dt) 
    web_data = data.frame(server, time, stringsAsFactors=FALSE) 
    web_data 
} 
total_data <- do.call(rbind, process_files) 

, если вам нужно разделить ваши данные в кусках, вы можете использовать функцию seq, чтобы получить начальные индексы кусков:

seq_ind <- seq(1, length(input_files), by=1000) 

Тогда вы можете получить список файлов, соответствующих каждую порцию с

files_in_chunks <- mapply(function(x, y) input_files[x:y], x=seq_ind, y=c(seq_ind[-1], length(input_files)), SIMPLIFY=FALSE) 
Смежные вопросы