2012-03-14 42 views
23

Tôi có một khung dữ liệu khá lớn trong R mà tôi muốn xuất sang SPSS. Tập tin này đã khiến tôi mất nhiều giờ để nhập nó vào R ngay từ đầu, tuy nhiên tôi đã sử dụng thành công read.fwf() bằng cách sử dụng các tùy chọn comment.char="%" (một ký tự không xuất hiện trong tệp) và fill= TRUE (đó là tệp ASCII có chiều rộng cố định với một số hàng thiếu tất cả các biến, gây ra thông báo lỗi).Cách hiệu quả nhất để xuất dữ liệu lớn (3.9 mill obs) thành tệp văn bản?

Dù sao, khung dữ liệu của tôi hiện bao gồm 3,9 quan sát nhà máy và 48 biến (tất cả ký tự). Tôi có thể ghi nó vào tập tin khá nhanh chóng bằng cách chia nó thành 4 x 1 mill obsith với df2 <- df[1:1000000,] theo sau là write.table(df2) vv, nhưng không thể ghi toàn bộ tập tin trong một lần quét mà không cần máy tính khóa và cần thiết lập lại cứng lên.

Sau khi nghe những câu chuyện giai thoại về cách R không phù hợp với các tập dữ liệu lớn trong nhiều năm, đây là lần đầu tiên tôi gặp sự cố loại này. Tôi tự hỏi liệu có cách tiếp cận khác (cấp thấp "bán phá giá" các tập tin trực tiếp vào đĩa?) Hoặc cho dù có một số gói không rõ với tôi mà có thể xử lý xuất khẩu các tập tin lớn của loại này một cách hiệu quả?

Trả lời

7

Khi đoán, máy của bạn thiếu RAM và vì vậy R phải sử dụng tệp hoán đổi, điều này làm chậm mọi thứ. Nếu bạn đang được trả tiền để mã, sau đó mua RAM nhiều hơn có thể sẽ rẻ hơn bạn viết mã mới.

Điều đó nói rằng, có một số khả năng. Bạn có thể xuất tệp sang cơ sở dữ liệu và sau đó sử dụng cơ sở dữ liệu của cơ sở dữ liệu đó để ghi vào một tệp văn bản. Câu trả lời của JD Long cho this question cho bạn biết cách đọc trong các tệp theo cách này; nó không quá khó để đảo ngược quá trình. Ngoài ra, các gói bigmemoryff (như đã đề cập bởi Davy) có thể được sử dụng để ghi các tệp đó.

+0

Hi Richie, tôi không chắc liệu 8 Gb RAM có đủ điều kiện là "viết tắt RAM" hay không, ngay cả với tập dữ liệu này. Tuy nhiên, tôi sẽ xem xét sử dụng 'sqldf()' như được đề xuất bởi JD Long vì tôi đang sử dụng nó rất nhiều trong các phân tích của mình. Cảm ơn con trỏ! – jans

7

Mặc dù tôi chỉ sử dụng nó để đọc các tệp rất lớn (10+ Gb) Tôi tin rằng gói ff có chức năng viết dfs cực lớn.

+0

Tôi đã thử vận ​​may của mình bằng 'ff()' nhưng bị lúng túng bởi cú pháp được sử dụng. Có thể không hoàn toàn quấn đầu của tôi xung quanh nó và thử nó trên tập hợp con của tập dữ liệu ban đầu đã không cho tôi nhiều lợi ích thời gian khôn ngoan. Dù sao cũng cảm ơn bạn. – jans

7

Vâng, như câu trả lời với các tệp thực sự lớn và R thường là, tốt nhất là giảm tải loại công việc này xuống cơ sở dữ liệu. SPSS có kết nối ODBC và RODBC cung cấp giao diện từ R đến SQL.

Tôi lưu ý rằng trong quá trình kiểm tra thông tin của mình, tôi đã bị xúc phạm.

24

1) Nếu tệp của bạn là tất cả các chuỗi ký tự, thì tệp sẽ tiết kiệm được bằng cách sử dụng write.table() nhanh hơn nhiều nếu bạn thay đổi lần đầu tiên thành matrix.

2) cũng viết ra theo khối, nói 1000000 hàng, nhưng luôn luôn cho cùng một tệp và sử dụng đối số append = TRUE.

+1

Giải pháp thông minh hoàn toàn. Sẽ không làm việc cho data.frames nơi các biến là các loại khác nhau, nhưng chắc chắn là một sửa chữa tốt ở đây! –

+0

hehe, tôi phải làm điều tương tự với dữ liệu gần như cùng kích thước: bạn sẽ không thể làm việc với vi sinh hoặc tử vong của Hoa Kỳ, phải không? –

+0

@tim riffe: Không, nhưng phân loại, đây là những dữ liệu sinh và bò sinh sản :) – jans

13

Cập nhật

Sau giờ làm việc rộng Matt Dowle parallelizing và thêm những cải tiến hiệu quả khác, fread tại là càng nhiều càng tốt 15x nhanh hơn so với write.csv. Xem câu trả lời được liên kết để biết thêm.


Bây giờ data.table có chức năng fwrite góp của Otto Seiskari mà có vẻ là khoảng hai lần nhanh như write.csv nói chung. Xem here để biết một số điểm chuẩn.

library(data.table) 
fwrite(DF, "output.csv") 

Lưu ý rằng tên hàng bị loại trừ, vì loại data.table không sử dụng chúng.

Các vấn đề liên quan