2011-09-07 37 views
14

Tôi có tệp .csv: example.csv với 8000 cột x 40000 hàng. Tệp csv có tiêu đề chuỗi cho mỗi cột. Tất cả các trường chứa giá trị số nguyên từ 0 đến 10. Khi tôi cố tải tệp này bằng read.csv, nó trở nên cực kỳ chậm. Nó cũng rất chậm khi tôi thêm một tham số nrow = 100. Tôi tự hỏi nếu có một cách để tăng tốc read.csv, hoặc sử dụng một số chức năng khác thay vì read.csv để tải các tập tin vào bộ nhớ như là một ma trận hoặc data.frame?read.csv cực kỳ chậm đọc các tệp csv với số lượng lớn các cột

Xin cảm ơn trước.

+2

hãy chia sẻ mã bạn đang sử dụng để đọc.csv - có rất nhiều tùy chọn để cải thiện hiệu suất, xem? read.table – mdsumner

Trả lời

15

Nếu CSV của bạn chỉ chứa số nguyên, bạn nên sử dụng scan thay vì read.csv, vì ?read.csv nói:

‘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. 

Kể từ khi tập tin của bạn có một tiêu đề, bạn sẽ cần skip=1, và nó có lẽ sẽ nhanh hơn nếu bạn thiết lập what=integer(). Nếu bạn phải sử dụng read.csv và tốc độ/bộ nhớ tiêu thụ là một mối quan tâm, thiết lập các đối số colClasses là một trợ giúp rất lớn.

+1

Bạn có thể thêm lại tên của các cột bằng cách đọc một dòng của anh ta tiêu đề như một vectơ với hàm 'readLines()' và sửa đổi các tên cột của ma trận của bạn. – John

+1

Cảm ơn. Tôi chỉ tìm thấy một hàm bao bọc khác sử dụng hàm scan(): read.matrix trong gói tseries. Nó cho rằng nó nhanh hơn read.csv. – rninja

3

Nếu bạn thường xuyên đọc tệp, bạn cũng nên lưu tệp đó từ R ở định dạng nhị phân sử dụng hàm save. Chỉ định compress=FALSE thường dẫn đến thời gian tải nhanh hơn.

... Sau đó, bạn có thể tải nó bằng chức năng (bất ngờ!) 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 
+2

Tốc độ nén có phụ thuộc vào nhiều yếu tố và có thể được kiểm tra trên cơ sở/tệp/máy hay không. Tốc độ HD, tốc độ CPU và mức độ nén đạt được tất cả đóng góp cho dù tệp nén hoặc không nén được tải nhanh hơn hay không. Nhưng nói chung, không nén có thể nhanh hơn khi tốc độ ổ đĩa là tốt và tốc độ CPU không phải là trong khi ngược lại là đúng cho nén. Ví dụ, tôi có xu hướng muốn sử dụng nén văn bản để ổ đĩa flash USB trên một máy tính xách tay nhanh. – John

+0

@ John - Điểm tốt. Đó là lý do tại sao tôi nói "thường" ;-) – Tommy

8

Hãy thử sử dụng fread{data.table}. Đây là một trong những cách nhanh nhất để đọc các tệp .csv vào R. Có một số good benchmark here.

library(data.table) 

data <- fread("c:/data.csv") 

Nếu bạn muốn làm cho nó thậm chí còn nhanh hơn, bạn cũng có thể chỉ đọc các tập hợp con của cột mà bạn muốn sử dụng:

data <- fread("c:/data.csv", select = c("col1", "col2", "col3")) 
+0

fread treo ngay lập tức trên dữ liệu của tôi (có một ít hơn một triệu cột) – shreyasgm

+0

Điều này là lạ; Tôi khuyên bạn nên gỡ cài đặt và cài đặt lại thư viện: ´remove.packages ("data.table"); install.packages ("data.table") ´. Nếu sự cố vẫn tiếp diễn, bạn có thể muốn xem xét việc mở ´issue 'trên trang web của dự án https://github.com/Rdatatable/data.table/wiki –

3

Cũng thử readr gói Hadley Wickham:

library(readr) 
data <- read_csv("file.csv") 
Các vấn đề liên quan