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")