Изменения

Перейти к: навигация, поиск

R:Оптимизация/Импорт данных

4349 байтов добавлено, 13:08, 5 апреля 2014
Новая страница: «При обработке данных большого объёма имеет смысл импортировать только ту часть данных, …»
При обработке данных большого объёма имеет смысл импортировать только ту часть данных, которая непосредственно участвует в обработке. Это целесообразно как с точки зрения расхода оперативной памяти, так и скорости выполнения операций поиска, сортировки и фильтрации данных.

== Импорт CSV ==

=== Функция <code>read.table()</code> ===

Наиболее распространённым форматом данных для импорта в R является формат CSV. Для импорта файлов CSV в R предусмотрена функция <code>read.table()</code> и функци-обёртка (wrapper) <code>read.csv()</code>. С точки зрения скорости работы, параметры функции <code>read.table()</code>, заданные по умолчанию, не являются оптимальными. Приведём несколько рекомендаций по использованию функции <code>read.table()</code>:

* указать тип переменных, содержащихся в таблице с помощью аргумента <code>colClasses</code>;
* указать количество импортируемых строк с помощью аргумента <code>nrows</code>;
* отключить поиск комментариев с помощью аргумента <code>comment.char = ""</code>.

Создадим таблицу данных содержащую <math>10^{5}</math> строк и 6 столбцов:

{{r-code|code=<nowiki>> N <- 10^5L # задаём количество наблюдений
> DF <- data.frame(a = sample(1:10^3L, N, replace = TRUE),
b = sample(1:10^3L, N, replace = TRUE),
c = sample(LETTERS[1:10], N, replace = TRUE),
e = rnorm(N),
d = rnorm(N, 100, 15),
f = runif(N, 0, 10^3L))
</nowiki>}}

Рассмотрим таблицу более подробно. Начало таблицы:

{{r-code|code=<nowiki> head(DF)
a b c e d f
1 719 104 C -1.8785 87.22 400.5
2 551 448 H 0.5608 101.14 208.4
3 865 236 I 0.5967 117.80 622.5
4 879 411 B -0.6442 120.39 979.9
5 66 229 E -0.5443 111.78 901.3
6 867 579 I -1.3212 104.93 178.3</nowiki>}}

Структура данных:

{{r-code|code=<nowiki>> str(DF)
'data.frame': 1000000 obs. of 6 variables:
$ a: int 719 551 865 879 66 867 344 786 898 933 ...
$ b: int 104 448 236 411 229 579 718 221 68 275 ...
$ c: Factor w/ 10 levels "A","B","C","D",..: 3 8 9 2 5 9 3 6 10 7 ...
$ e: num -1.878 0.561 0.597 -0.644 -0.544 ...
$ d: num 87.2 101.1 117.8 120.4 111.8 ...
$ f: num 400 208 623 980 901 ...</nowiki>}}

Типы переменных:

{{r-code|code=<nowiki>> sapply(DF, class)
a b c e d f
"integer" "integer" "factor" "numeric" "numeric" "numeric"</nowiki>}}

Размер объекта в оперативной памяти:

{{r-code|code=<nowiki>> print(object.size(DF), units = "auto")
34.3 Mb</nowiki>}}

Сохраним таблицу в csv-файл следующими командами:

{{r-code|code=<nowiki>> tmp.csv <- tempfile(fileext=".csv") # генерируем имя и путь для временного файла
> write.table(DF, tmp.csv, sep = ";", row.names = FALSE, quote = FALSE)</nowiki>}}

Размер полученного файла составил:

{{r-code|code=<nowiki>> file.info(tmp.csv)$size # размер файла в байтах
[1] 61724411
> file.info(tmp.csv)$size / 1024^2 # размер файла в мегабайтах
[1] 58.86</nowiki>}}

Теперь мы можем сравнить производительность функции <code>read.table()</code> с параметрами по умолчанию и парамтерами, рекомендованными для увеличения производительности данной функции. Для этого нам понадобится пакет {{r-package|microbenchmark}}.

Навигация