Спасибо всем за советы и ответы, я сделал некоторые выводы и эксперимент на их основе.
См. Небольшой тест с общедоступной базой данных ( ESS 2008 в Венгрии ) ниже.В базе данных 1508 наблюдений и 508 переменных, поэтому это могут быть данные среднего размера.Это может быть хорошим примером для проведения теста (для меня), но, конечно, для особых нужд потребуется эксперимент с адекватными данными.
Чтение данных из файла SPSS sav без каких-либомодификация:
> system.time(data <- read.spss('ESS_HUN_4.sav'))
user system elapsed
2.214 0.030 2.376
Загрузка с преобразованным двоичным объектом:
> save('data',file='ESS_HUN_4.Rdata')
> system.time(data.Rdata <- load('ESS_HUN_4.Rdata'))
user system elapsed
0.28 0.00 0.28
Попытка с csv :
> write.table(data, file="ESS_HUN_4.csv")
> system.time(data.csv <- read.csv('ESS_HUN_4.csv'))
user system elapsed
1.730 0.010 1.824
Попытка с "штрафом-tuned " csv загрузка:
> system.time(data.csv <- read.table('ESS_HUN_4.csv', comment.char="", stringsAsFactors=FALSE, sep=","))
user system elapsed
1.296 0.014 1.362
Также с пакетом sqldf , который, кажется, загружает CSV-файлы намного быстрее:
> library(sqldf)
> f <- file("ESS_HUN_4.csv")
> system.time(bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F, sep="\t")))
user system elapsed
0.939 0.106 1.071
А также загрузка данных из базы данных MySQL, работающей на localhost:
> library(RMySQL)
> con <- dbConnect(MySQL(), user='root', dbname='test', host='localhost', password='')
> dbWriteTable(con, "data", as.data.frame(data), overwrite = TRUE)
> system.time(data <- dbReadTable(con, 'data'))
user system elapsed
0.583 0.026 1.055
> query <-('SELECT * FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.270 0.020 0.473
Здесь, я думаю, мы должны добавить две сообщенные system.time
, поскольку подключение к данным также имеет значение в нашем случае.Пожалуйста, прокомментируйте, если я что-то неправильно понял.
Но давайте посмотрим, запрашивает ли только некоторые переменные, например.при построении графиков нам в большинстве случаев не нужны все кадры данных, и для создания хорошего графика из них достаточно запроса только двух переменных:
> query <-('SELECT c1, c19 FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.030 0.000 0.112
Что, кажется, действительно здорово!Конечно, сразу после загрузки таблицы с dbReadTable
Сводка: ничто не сравнится с чтением целых данных из двоичного файла, но с чтением только нескольких столбцов (или других отфильтрованных данных) из такая же таблица базы данных может также взвешиваться в некоторых особых случаях.
Среда тестирования: ноутбук HP 6715b (AMD X2 2 ГГц, 4 ГБ DDR2) с недорогим твердотельным накопителем.
ОБНОВЛЕНИЕ (24/01/2011) : я добавил довольно хакерский, но довольно «креативный» способ загрузки только нескольких столбцов двоичного объекта - который выглядит намного быстрее любогометод, рассмотренный выше.
Имейте в виду: код будет выглядеть очень плохо, но все же очень эффективно:)
Сначала я сохраняю все столбцы data.frame в разные двоичные объекты с помощью следующегоцикл:
attach(data)
for (i in 1:length(data)) {
save(list=names(data)[i],file=paste('ESS_HUN_4-', names(data)[i], '.Rdata', sep=''))
}
detach(data)
И затем я загружаю два столбца данных:
> system.time(load('ESS_HUN_4-c19.Rdata')) +
> system.time(load('ESS_HUN_4-c1.Rdata')) +
> system.time(data.c1_c19 <- cbind(c1, c19))
user system elapsed
0.003 0.000 0.002
Что выглядит как «сверхбыстрый» метод!:) Примечание: он был загружен в 100 раз быстрее , чем самый быстрый (загружающий весь двоичный объект) метод, описанный выше.
Я составил очень крошечный пакет (названный: saves ), посмотрите в github для получения дополнительной информации, если вы заинтересованы.
ОБНОВЛЕНИЕ (03/03/2011) : новая версия моего маленького пакета ( сохраняет ) была загружена в CRAN, в которой можно сохранять и загружать переменные еще быстрее - еслитолько пользователю требуется только подмножество доступных переменных во фрейме или списке данных.См. виньетка в источниках пакета для деталей или тот, что на моей домашней странице , и позвольте мне также представить хороший блокпост с некоторыми сделанными тестами:
Этот блок-график показывает преимущество использования save пакета для загрузки только подмножества переменных против load
и read.table
или read.csv
из базы, read.spss
из внешней или sqldf
или RMySQL
пакетов.