Read.csv очень медленно читает csv файлы с большим количеством столбцов
У меня есть. CSV файл: example.csv с 8000 столбцами x 40000 строк. Файл csv имеет заголовок строки для каждого столбца. Все поля содержат целочисленные значения от 0 до 10. Когда я пытаюсь загрузить этот файл с read.csv, он оказывается чрезвычайно медленным. Это также очень медленно, когда я добавляю параметр nrow = 100. Интересно, есть ли способ ускорить чтение .csv или использовать какую-то другую функцию вместо read.csv для загрузки файла в память в виде матрицы или data.frame?
Спасибо заранее.
Ответы
Ответ 1
Если ваш CSV содержит только целые числа, вы должны использовать scan
вместо read.csv
, так как ?read.csv
говорит:
‘read.table’ is not the right tool for reading large matrices,
especially those with many columns: it is designed to read _data
frames_ which may have columns of very different classes. Use
‘scan’ instead for matrices.
Поскольку ваш файл имеет заголовок, вам понадобится skip=1
, и он, вероятно, будет быстрее, если вы установите what=integer()
. Если вы должны использовать read.csv
, а потребление скорости/памяти является проблемой, установка аргумента colClasses
- огромная помощь.
Ответ 2
Попробуйте использовать fread{data.table}
. Это, безусловно, самый быстрый способ читать .csv
файлы в R. Здесь есть хороший тест.
library(data.table)
data <- fread("c:/data.csv")
Если вы хотите сделать это еще быстрее, вы также можете прочитать только подмножество столбцов, которые вы хотите использовать:
data <- fread("c:/data.csv", select = c("col1", "col2", "col3"))
Ответ 3
Если вы будете часто читать файл, возможно, стоит сохранить его из R в двоичном формате с помощью функции save
. Указание compress=FALSE
часто приводит к более быстрому времени загрузки.
... Затем вы можете загрузить его с помощью функции (сюрприз!) load
.
d <- as.data.frame(matrix(1:1e6,ncol=1000))
write.csv(d, "c:/foo.csv", row.names=FALSE)
# Load file with read.csv
system.time( a <- read.csv("c:/foo.csv") ) # 3.18 sec
# Load file using scan
system.time( b <- matrix(scan("c:/foo.csv", 0L, skip=1, sep=','),
ncol=1000, byrow=TRUE) ) # 0.55 sec
# Load (binary) file using load
save(d, file="c:/foo.bin", compress=FALSE)
system.time( load("c:/foo.bin") ) # 0.09 sec
Ответ 4
Также попробуйте пакет Hadley Wickham readr
:
library(readr)
data <- read_csv("file.csv")