2013-12-02 1 views
0

Я читаю в большом файле по одной строке за раз. То, что я хотел бы сделать, чтобы ускорить все, - это работать на нескольких линиях параллельно. Но то, как я делаю это сейчас, не работает. Я никогда не пробовал этого, поэтому я не совсем уверен, как это работает.Работайте по одной строке одновременно параллельно

testdata.csv

library(foreach) 
library(doParallel) #or with doMC 



read.block <- function(ifile, lines, block, readFunc=read.csv, 
        skip=(lines*(block-1))+ifelse((header) & (block>1) & (!inherits(ifile, "connection")),1,0), 
        nrows=lines,header=TRUE,sep="\t",...){ 
    if(block > 1){ 
    colnms<-NULL 
    if(header) 
    { 
     colnams <- unlist(readFunc(ifile, nrows=1, header=FALSE, sep=sep, stringsAsFactors=FALSE)) 
     #print(colnams) 
    } 
    p = readFunc(ifile, skip = skip, nrows = nrows, header=FALSE, sep=sep,...) 
    if(! is.null(colnams)) 
    { 
     colnames(p) = colnams 
    } 
    } else { 
    p = readFunc(ifile, skip = skip, nrows = nrows, header=header, sep=sep) 
    } 
    return(p) 
} 

mendl.error <- matrix(, nrow=15, ncol=9) 

foreach(i=1:15)%dopar%{ 
    ifile.c <- file("testdata.csv", open = "r") #open file connection to read 
    ifile.valid <- read.block(ifile.c, lines=1, block=i) #read 1 line 
    close(ifile.c) 
#do some other operations on the line which will be saved into a matrix 
    mendl.error[1,] <- ifile.valid 
} 
+0

Является ли проблема скоростью? .. потому что я могу придумать много других более простых (и, возможно, более вероятных для работы) способов ускорения работы ... –

+0

Да. Но имейте в виду, что это всего лишь отрывок из большого сценария. – crysis405

+0

Это читается как код C ... это не очень хорошо, потому что R совсем не похож на C. –

ответ

2

Вы не указали, что «не работает» означает, но я собираюсь на конечности и сказать, что это не ускорит, как и ожидалось (хотя я также не совсем понятно о семантике того, что вы пытаетесь сделать).

Причина в том, что ваш код не вычисляется, он связан с IO. Значит, он должен ждать данных из вторичного хранилища. Шина для этих данных не является параллельной, поэтому все ваши запросы на чтение данных становятся сериализованными. Вы не можете значительно ускорить это, используя параллелизм в моде, который вы пытаетесь сделать.

На самом деле, ваш код, вероятно, ускоряется, если вы читаете за один раз и полагаетесь на R, чтобы поступать правильно. Если вам действительно нужна сырая производительность чтения, вам, вероятно, придется прибегать к файлам с отображением памяти. Быстрый поиск в Google показал R package bigmemory, который реализует это.

+0

Стоит отметить, что OP может использовать 'Rprof' для проверки того, что он привязан к I/O. –

+0

может быть 'fread' тоже в пакете' data.table' .. но не так. –

+0

Я использую следующий, чтобы перейти к следующей итерации цикла, который дает мне (извините, что не упоминал об этом): 'Ошибка в {: задача 11 с ошибкой -" no loop for break/next, jump to top level " Звонки :% dopar% -> ' – crysis405

 Смежные вопросы

  • Нет связанных вопросов^_^