2011-07-06 10 views
19

Tôi là người dùng R và tôi thường xuyên thấy rằng tôi cần viết các hàm yêu cầu tập hợp dữ liệu lớn (10 trong số hàng triệu hàng). Khi tôi áp dụng các chức năng như vậy trên một số lượng lớn các quan sát, nó có thể mất rất nhiều thời gian nếu tôi không cẩn thận về cách tôi thực hiện nó.Cách nhanh nhất để tập hợp con - data.table so với MySQL

Để thực hiện việc này, đôi khi tôi đã sử dụng gói data.table và điều này cung cấp tốc độ nhanh hơn nhiều so với việc đặt trước bằng cách sử dụng các khung dữ liệu. Gần đây, tôi đã bắt đầu thử nghiệm với các gói như RMySQL, đẩy một số bảng vào mysql và sử dụng gói để chạy truy vấn sql và trả về kết quả.

Tôi đã tìm thấy các cải tiến hiệu suất hỗn hợp. Đối với các tập dữ liệu nhỏ hơn (hàng triệu), có vẻ như việc tải dữ liệu vào một data.table và thiết lập các phím bên phải làm cho việc subsetting nhanh hơn. Đối với các tập dữ liệu lớn hơn (10 đến 100 của hàng triệu), nó xuất hiện gửi một truy vấn đến mysql di chuyển nhanh hơn.

Đã tự hỏi liệu có ai có cái nhìn sâu sắc về kỹ thuật nào nên trả lại các truy vấn đơn giản hoặc tập hợp đơn giản nhanh hơn và liệu điều này có phụ thuộc vào kích thước của dữ liệu không? Tôi hiểu rằng việc thiết lập các khóa trong data.table có phần tương tự để tạo ra một chỉ mục, nhưng tôi không có nhiều trực giác hơn thế nữa.

+0

Tôi biết một số người khác ở đây có nhiều kinh nghiệm hơn về điều này, vì vậy tôi sẽ để họ giải thích bằng câu trả lời thực tế, nhưng tôi nghi ngờ bạn sẽ muốn xem gói 'sqldf' mô tả, chỉ có nó tạo ra bảng trong bộ nhớ (tôi nghĩ) để các truy vấn có thể chạy khá nhanh hơn một chút. – joran

+0

cảm ơn, joran! Tôi rất muốn hiểu điều này trong bối cảnh các bảng lớn. Đó là tất cả suy đoán, nhưng tôi đã nhận được lời khuyên rằng vấn đề tốc độ tôi có thể là do quản lý bộ nhớ/hạn chế. Sau khi tất cả, khi sử dụng dữ liệu.bảng, không phải là những bảng trong bộ nhớ là tốt? – exl

+0

Thật vậy, đối với dữ liệu bộ nhớ lớn sẽ là một vấn đề, nhưng tôi tin rằng sqldf có thể sử dụng db đĩa là tốt. Một lần nữa, tôi đã không sử dụng nó nhiều, tôi đã đề cập đến nó bởi vì toàn bộ gói của nó được xây dựng xung quanh khái niệm đẩy dữ liệu vào một db, thực hiện sql và sau đó trả về R. – joran

Trả lời

25

Nếu dữ liệu phù hợp với RAM, dữ liệu có thể nhanh hơn. Nếu bạn cung cấp một ví dụ, nó có thể sẽ trở nên hiển nhiên, nhanh chóng, rằng bạn đang sử dụng data.table xấu. Bạn đã đọc "những điều không nên làm" trên data.table wiki chưa?

SQL có giới hạn dưới vì đó là một cửa hàng hàng. Nếu dữ liệu phù hợp với RAM (và 64bit là khá một chút) thì data.table nhanh hơn không chỉ vì nó nằm trong RAM mà vì các cột nằm liền kề nhau trong bộ nhớ (giảm thiểu số lần tải trang từ RAM sang L2 cho hoạt động cột). Sử dụng data.table một cách chính xác và nó phải nhanh hơn giới hạn dưới của SQL. Điều này được giải thích trong Câu hỏi thường gặp 3.1. Nếu bạn thấy chậm hơn với data.table thì rất có thể bạn đang sử dụng data.table không đúng (hoặc có lỗi hiệu suất mà chúng tôi cần sửa). Vì vậy, hãy đăng một số bài kiểm tra, sau khi đọc wiki data.table.

+1

Doyle - Rất tuyệt! Bây giờ tôi cũng đang đi đến wiki. Tôi đã luôn luôn hiểu rằng Db là nhanh hơn cho hầu hết các truy vấn, nhưng bây giờ tôi có thể kiểm tra tại sao, và những gì những giới hạn được. Đôi khi người ta cần một điểm đúng hướng. . . Cảm ơn! – XIVSolutions

2

Tôi không phải là người dùng R, nhưng tôi biết một chút về Cơ sở dữ liệu. Tôi tin rằng MySQL (hoặc bất kỳ RDBMS uy tín nào khác) sẽ thực sự thực hiện các hoạt động subsetting của bạn nhanh hơn (bằng, giống như, một thứ tự độ lớn, thường) chặn bất kỳ tính toán bổ sung nào liên quan đến quá trình subsetting.

Tôi nghi ngờ độ trễ hiệu suất của bạn trên các tập dữ liệu nhỏ có liên quan đến chi phí kết nối và đẩy dữ liệu ban đầu vào MySQL. Có khả năng một điểm mà tại đó chi phí kết nối và thời gian truyền dữ liệu sẽ tăng thêm chi phí cho hoạt động của bạn hơn là MySQL đang tiết kiệm cho bạn.

Tuy nhiên, đối với các tập dữ liệu lớn hơn một mức tối thiểu nhất định, có vẻ như bạn thấy rằng chi phí này được bù đắp bằng tốc độ tuyệt đối của cơ sở dữ liệu.

Sự hiểu biết của tôi là SQL có thể đạt được hầu hết các hoạt động tìm nạp và phân loại nhiều, nhanh hơn nhiều so với các phép toán lặp lại trong mã. Nhưng người ta phải tính đến chi phí của kết nối và (trong trường hợp này) việc chuyển dữ liệu ban đầu qua dây mạng.

Tôi sẽ muốn nghe những gì người khác nói. . .

+0

cảm ơn bài đăng! chỉ cần làm rõ - tôi không đẩy các tập dữ liệu vào MySQL mỗi lần lặp; thay vào đó, tôi chỉ làm điều đó một lần trước khi chạy chức năng. Vì vậy, tôi chỉ cần đẩy từ R sang MySQL để lặp lại phạm vi tiếp cận là một giá trị hoặc một vectơ cho truy vấn để tập hợp con. – exl

+0

Hmm. Tôi vẫn sẽ quan tâm đến lý do đằng sau sự thay đổi về thống kê hiệu suất giữa các tập dữ liệu "nhỏ" và "lớn". Có thể vẫn còn liên quan đến chi phí kết nối, ngay cả khi không có sự thúc đẩy? (ví dụ: phí kết nối là phần trăm tổng thời gian thực hiện) – XIVSolutions