2009-07-15 16 views
6

Tôi đã viết một số công cụ rất cơ bản để nhóm, xoay vòng, liên kết và tổng hợp các tập dữ liệu có nguồn gốc từ các nguồn không phải DB (ví dụ: CSV, hệ thống OLTP). Phương pháp "nhóm theo" nằm ở cốt lõi của hầu hết các phương pháp này."Nhóm theo" và các thuật toán cơ sở dữ liệu khác?

Tuy nhiên tôi chắc chắn rất nhiều công việc đã được thực hiện trong việc đưa ra các thuật toán hiệu quả để nhóm dữ liệu ... và tôi chắc chắn rằng tôi không sử dụng chúng. Và Google-fu của tôi đã hoàn toàn thất bại trong việc biến bất cứ thứ gì.

Có bất kỳ nguồn hoặc sách trực tuyến tốt nào mô tả các phương pháp tốt hơn để tạo dữ liệu được nhóm không?

Hoặc tôi có nên bắt đầu xem xét nguồn MySQL hoặc một cái gì đó tương tự không?

+0

Tôi đặt cược bạn đã hoàn thành tối ưu hóa tại thời điểm này, nhưng Wes McKinney đã viết một chút về cách ông tiếp cận nhóm theo vấn đề trong thư viện Pandas của mình: http://wesmckinney.com/blog/mastering-high -performance-data-algorithm-i-group-by/ – DGrady

Trả lời

5

Một cách rất tiện lợi để "nhóm theo" một số trường (hoặc tập hợp các trường và biểu thức, nhưng tôi sẽ sử dụng "trường" để đơn giản!) Là khi bạn có thể sắp xếp để đi qua kết quả trước khi nhóm (RBG) theo cách được sắp xếp - bạn thực sự không quan tâm đến việc sắp xếp (lưu trong trường hợp phổ biến trong đó một ORDER BY cũng ở đó và chỉ xảy ra trên cùng một trường với GROUP BY! -), mà là về thuộc tính "hiệu ứng phụ" của thứ tự - tất cả các hàng trong RBG có cùng giá trị cho trường nhóm đến ngay sau mỗi trường khác, vì vậy bạn có thể tích lũy cho đến khi trường nhóm thay đổi, sau đó phát ra/cho kết quả tích lũy cho đến thời điểm này và tiến hành reinitialize các ắc quy với hàng mới (một với một giá trị khác nhau của trường nhóm) - hãy chắc chắn để "chỉ cần khởi tạo các ắc quy" ngay từ đầu, và "chỉ phát ra/thu được kết quả tích lũy" ở cuối , tất nhiên . Nếu điều này không hiệu quả, có thể bạn có thể băm trường nhóm và sử dụng bảng băm cho kết quả được tích lũy cho nhóm đó - tại mỗi hàng trong RBG, băm trường nhóm, kiểm tra xem nó đã có mặt chưa như một khóa trong bảng băm, nếu không đặt nó ở đó với các bộ tích lũy được khởi tạo hợp lý từ hàng RBG, thì hãy cập nhật các bộ tích lũy trên mỗi hàng RBG. Bạn chỉ phát ra mọi thứ ở cuối. Vấn đề tất nhiên là bạn đang chiếm nhiều bộ nhớ hơn cho đến khi kết thúc! -)

Đây là hai phương pháp cơ bản. Bạn có muốn giả mã cho mỗi, BTW?

+0

Cảm ơn Alex, những ý nghĩa hoàn toàn và tôi đang sử dụng đầu tiên. Bạn có biết bất kỳ nguồn nào tốt cho các thuật toán trong không gian này không? hay là kinh nghiệm cá nhân này? –

+0

Xin lỗi, về cơ bản là trải nghiệm cá nhân - từ khi người ta phải tự mình thực hiện những thứ như vậy (trên đầu ISAM hoặc những thứ như bsdimental early bsd-db), vì các công cụ SQL nhúng nhẹ không tồn tại hoặc rất đắt tiền (hiện nay tôi có xu hướng chỉ sử dụng SQLite khi tôi cần một công cụ nhúng ;-). –

+0

Điểm tốt Alex, tôi đã xem xét SQLlite và nó trông tốt. Nhìn lại tôi dường như đã thực hiện cùng một giải pháp này trong các ngôn ngữ khác nhau từ C và Perl để VBA :) –

1

Bạn nên kiểm tra cơ sở dữ liệu OLAP. OLAP cho phép bạn tạo ra một cơ sở dữ liệu của các tập hợp có nghĩa là để được phân tích trong một "lát và xúc xắc" thời trang.

Các biện pháp tổng hợp như số lượng, trung bình, phút, tối đa, tổng và stdev có thể được phân tích nhanh chóng bởi bất kỳ số thứ nguyên nào bằng cơ sở dữ liệu OLAP.

Xem this giới thiệu về OLAP trên MSDN.

+0

Cảm ơn jn29098. Có lẽ không phải những gì tôi đang tìm kiếm, nhưng một liên kết tốt đẹp trên OLAP :) –

0

Đặt một tệp CSV mẫu và loại kết quả mong muốn và tôi có thể giải quyết một giải pháp bằng Python cho bạn.

Python có mô-đun CSV và danh sách/trình phát hiểu được có thể trợ giúp với loại điều này.

  • Paddy.
+0

Cảm ơn Paddy, tôi đang tìm kiếm nhiều hơn cho một thuật toán chứ không phải là một giải pháp cụ thể (tôi có một). Tôi đang tối ưu hóa vì vậy tôi muốn chắc chắn rằng tôi đã không làm gì ngu ngốc :) –

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