Я пришел к следующему решению, которое будет работать для файлов размером менее 2 ^ 32 - 1 байт.
Объект R необходимо сериализовать и сохранить в файл, как показано в следующем коде.
saveObj <- function(object, file.name){
outfile <- file(file.name, "wb")
serialize(object, outfile)
close(outfile)
}
Затем мы читаем двоичные данные кусками, отслеживая, сколько этосоответственно прочитайте и обновите индикатор выполнения.
loadObj <- function(file.name){
library(foreach)
filesize <- file.info(file.name)$size
chunksize <- ceiling(filesize / 100)
pb <- txtProgressBar(min = 0, max = 100, style=3)
infile <- file(file.name, "rb")
data <- foreach(it = icount(100), .combine = c) %do% {
setTxtProgressBar(pb, it)
readBin(infile, "raw", chunksize)
}
close(infile)
close(pb)
return(unserialize(data))
}
Код можно запустить следующим образом:
> a <- 1:100000000
> saveObj(a, "temp.RData")
> b <- loadObj("temp.RData")
|======================================================================| 100%
> all.equal(b, a)
[1] TRUE
Если мы сравниваем метод индикатора выполнения с чтением файла в одном фрагменте, мыувидеть, что индикатор выполнения немного медленнее, но его недостаточно для беспокойства.
> system.time(unserialize(readBin(infile, "raw", file.info("temp.RData")$size)))
user system elapsed
2.710 0.340 3.062
> system.time(b <- loadObj("temp.RData"))
|======================================================================| 100%
user system elapsed
3.750 0.400 4.154
Так что, хотя вышеуказанный метод работает, я чувствую, что он совершенно бесполезен из-за ограничений размера файла.Индикаторы выполнения полезны только для больших файлов, чтение которых занимает много времени.
Было бы замечательно, если бы кто-то смог придумать что-то лучше, чем это решение!