2012-09-12 17 views
6

Đọc xung quanh, tôi phát hiện ra rằng cách tốt nhất để đọc tệp csv lớn hơn bộ nhớ là sử dụng read.csv.sql từ gói sqldf. Hàm này sẽ đọc dữ liệu trực tiếp vào cơ sở dữ liệu sqlite, và do đó thực thi câu lệnh sql. Tôi nhận thấy những điều sau đây: có vẻ như dữ liệu đọc vào sqlite được lưu trữ trong một bảng tạm thời, để cho nó có thể truy cập được để sử dụng trong tương lai, nó cần phải được hỏi như vậy trong câu lệnh sql.Đọc tập tin csv lớn vào R với sqldf hoạt động nhưng tập tin sqlite mất gấp đôi không gian cần và cần "hút bụi"

Như một ví dụ, đoạn code sau đọc một số dữ liệu mẫu vào sqlite:

# generate sample data 
sample_data <- data.frame(col1 = sample(letters, 100000, TRUE), col2 = rnorm(100000)) 
# save as csv 
write.csv(sample_data, "sample_data.csv", row.names = FALSE) 
# create a sample sqlite database 
library(sqldf) 
sqldf("attach sample_db as new") 
# read the csv into the database and create a table with its content 
read.csv.sql("sample_data.csv", sql = "create table data as select * from file", 
      dbname = "sample_db", header = T, row.names = F, sep = ",") 

Dữ liệu sau đó có thể được truy cập với sqldf("select * from data limit 5", dbname = "sample_db").

Sự cố là như sau: tệp sqlite chiếm nhiều gấp đôi dung lượng. Tôi đoán là nó chứa dữ liệu hai lần: một lần để đọc tạm thời và một lần cho bảng được lưu trữ. Có thể dọn sạch cơ sở dữ liệu với sqldf("vacuum", dbname = "sample_db"). Điều này sẽ lấy lại không gian trống, nhưng phải mất một thời gian dài, đặc biệt là khi tập tin lớn.

Có giải pháp nào tốt hơn cho điều này không tạo ra sự sao chép dữ liệu này lần đầu tiên không?

+3

Bạn có thể muốn sử dụng RSQLite trực tiếp cho điều này theo đề nghị của một responder nhưng tôi đã cập nhật ví dụ 9 và 10 trên trang sqldf nhà để hiển thị như thế nào để sử dụng kết nối liên tục sqldf để thực hiện điều này mà không cần sao chép. Xem đặc biệt là ví dụ 10c. Cũng lưu ý rằng sqldf chấp nhận một vectơ các câu lệnh sql và sẽ không phá hủy cơ sở dữ liệu cho đến khi câu lệnh cuối cùng trong vectơ đã được thực hiện. –

Trả lời

9

Giải pháp: sử dụng RSQLite mà không đi qua sqldf:

library(RSQLite) 
con <- dbConnect("SQLite", dbname = "sample_db") 
# read csv file into sql database 
dbWriteTable(con, name="sample_data", value="sample_data.csv", 
      row.names=FALSE, header=TRUE, sep = ",") 
Các vấn đề liên quan