Tùy chọn phân tích dữ liệu ngoài lõi


18

Tôi đã sử dụng SAS chuyên nghiệp được gần 5 năm rồi. Tôi đã cài đặt nó trên máy tính xách tay của mình và thường xuyên phải phân tích các bộ dữ liệu với 1.000-2.000 biến và hàng trăm nghìn quan sát.

Tôi đã tìm kiếm các lựa chọn thay thế cho SAS cho phép tôi tiến hành phân tích trên các tập dữ liệu có kích thước tương tự. Tôi tò mò những gì người khác sử dụng cho các tình huống như thế này. Đây chắc chắn không phải là "Dữ liệu lớn" theo cách được sử dụng ngày nay. Bộ dữ liệu của tôi cũng không đủ nhỏ để giữ trong bộ nhớ. Tôi cần một giải pháp có thể áp dụng thuật toán cho dữ liệu được lưu trữ trên ổ cứng. Đây là những điều tôi đã điều tra vô ích:

  1. R - BigMemory có thể tạo ma trận được lưu trữ ngoài bộ nhớ, nhưng các phần tử phải có cùng chế độ. Tôi làm việc với dữ liệu gần như phân chia 50/50 giữa ký tự và số. Gói FF gần hơn với những gì tôi cần, nhưng tôi không hiểu thủ tục nào tương thích với nó. Tôi nghĩ rằng sự hỗ trợ có phần hạn chế.
  2. Gấu trúc - Tôi đã rất vui mừng về một sự thay thế Pythonic cho R. Tuy nhiên, nó cũng phải chứa tất cả dữ liệu trong bộ nhớ.
  3. Revolution R - Điều này cho thấy khá nhiều hứa hẹn. Tôi có một bản sao trên máy tính ở nhà của tôi (miễn phí nếu bạn đăng ký Kaggle) và vẫn chưa thử nghiệm nó như là sự thay thế khả thi cho SAS. Nhận xét về Revolution R như một sự thay thế của SAS được đánh giá cao.

Cảm ơn

CẬP NHẬT 1

Chỉnh sửa để thêm rằng tôi đang tìm kiếm các giải pháp thực tế, thực tế mà mọi người đã sử dụng thành công. Đối với hầu hết các phần, SAS cho phép tôi chug qua các tệp lớn mà không phải lo lắng một chút về các hạn chế bộ nhớ. Tuy nhiên, SAS được triển khai, họ đã tìm ra cách làm cho việc quản lý bộ nhớ trở nên minh bạch đối với người dùng. Nhưng, với một trái tim nặng nề, tôi đã sử dụng SAS cho công việc của mình (tôi phải) và sẽ YÊU một sự thay thế FOSS cho phép tôi làm việc trên dữ liệu "lớn" mà không phải suy nghĩ quá nhiều về việc dữ liệu được đặt ở đâu thời gian cụ thể (trong bộ nhớ hoặc trên đĩa).

Những thứ gần nhất tôi gặp phải là gói FF của R và một thứ gì đó trên đường chân trời cho Python có tên là Blaze . Tuy nhiên, những vấn đề này đã tồn tại trong nhiều năm, vậy các nhà phân tích đã làm gì trong thời gian đó? Làm thế nào họ xử lý các vấn đề tương tự với giới hạn bộ nhớ? Phần lớn các giải pháp được cung cấp dường như là:

  • Nhận thêm RAM - Đây không phải là một giải pháp tốt, imo. Thật dễ dàng để tìm một tập dữ liệu có thể vượt quá RAM nhưng vẫn vừa với ổ cứng. Hơn nữa, dòng công việc phải chứa tất cả các cấu trúc được tạo ra trong quá trình phân tích dữ liệu thăm dò.
  • Tập hợp dữ liệu - Điều này tốt cho việc thăm dò nhưng không phải để hoàn thiện kết quả và báo cáo. Cuối cùng, bất kỳ quy trình nào được phát triển trên một tập hợp con sẽ phải được áp dụng cho toàn bộ tập dữ liệu (trong trường hợp của tôi, dù sao đi nữa).
  • Chunk thông qua dữ liệu - Đây là những gì tôi muốn biết thêm từ những người thực sự thực hiện quy trình công việc này. Làm thế nào được thực hiện? Với công cụ gì? Nó có thể được thực hiện theo cách minh bạch cho người dùng không? (nghĩa là tạo một số cấu trúc dữ liệu trên đĩa và công việc khung sẽ đảm nhiệm việc phân đoạn dưới mui xe).

1
Các phiên bản mới hơn của Stata trên máy 64 bit không có vấn đề gì với bộ dữ liệu kích thước này (vì 5GB dễ dàng phù hợp với RAM hiện nay) nhưng bạn có quan tâm đến các lựa chọn thay thế thương mại cho SAS hay bạn chỉ tìm kiếm FOSS?
whuber

1
Vâng, giải pháp FOSS là những gì tôi đang tìm kiếm. Tôi đồng ý rằng một bộ dữ liệu có thể phù hợp với 5 hợp đồng RAM, nhưng nó cũng phải xử lý các hoạt động và cấu trúc dữ liệu bổ sung được tạo trong quá trình phân tích dữ liệu thăm dò. Kết hợp điều này với máy tính xách tay thương mại được trang bị RAM 4GB ít ỏi và chi phí sử dụng mà HĐH và Lỗi bộ nhớ hiển thị khá nhanh.
Zelazny7

2
@ Zelazny7: Thêm một 4Gigs khác vào máy tính xách tay sẽ khá rẻ trong những ngày này. :)
tò mò_cat

3
Một tùy chọn khác là lưu trữ dữ liệu trong cơ sở dữ liệu (SQL hoặc cách khác). Thông thường, một phân tích sẽ chỉ yêu cầu một tập hợp con dữ liệu (các biến 1:10, chứ không phải 1: 1000) sẽ phù hợp với bộ nhớ. Nếu tập hợp con vẫn lớn hơn bộ nhớ, việc phân tích có thể được thực hiện theo từng khối (tải dữ liệu từ cơ sở dữ liệu 1000 quan sát tại một thời điểm, kết hợp một cách thích hợp các kết quả với nhau ở cuối).
jthetzel

1
Hãy chắc chắn xem lại các câu hỏi dữ liệu lớn về SO, cũng như chế độ xem tác vụ điện toán hiệu năng cao trên CRAN để biết thêm các cuộc thảo luận liên quan, nếu bạn chưa có.
jthetzel

Câu trả lời:


3

nếu bạn đạt tối đa 500.000 bản ghi x 2.000 biến, tôi sẽ chi thêm một ít tiền cho RAM cho máy tính xách tay của bạn và được thực hiện với nó. nếu bạn có 16GB, có lẽ bạn có thể đọc trực tiếp tập dữ liệu mà bạn mô tả vào R. và tại thời điểm đó, bạn sẽ có thể làm được nhiều hơn nữa - và rất nhanh chóng .. nhưng bạn nói rằng đó không phải là một lựa chọn, vì vậy:

hãy xem các gói dựa trên SQL cho R. chúng cho phép bạn kết nối với cơ sở dữ liệu bên ngoài và truy cập các bảng đó thông qua SQL. vì SQL khá phổ biến (và vì R là nguồn mở), mã của bạn sẽ không bị mất nếu bạn thay đổi công việc hoặc mất quyền truy cập vào SAS. cơ sở dữ liệu bên ngoài dễ nhất để thiết lập là RSQLitenhưng nhanh nhất là MonetDB.R( kiểm tra tốc độ )

có lẽ có một vài giải pháp tốt cho vấn đề đã nêu của bạn, tôi đoán là tất cả chúng đều liên quan đến R;)


2

Có thể nó không quá nhiều về các ứng dụng / vấn đề bạn đang hướng tới, và đặc điểm của nó, nhưng nhiều hơn về các thuật toán và biến thể bạn đang sử dụng. Cụ thể hơn, để xử lý dữ liệu lớn, nhiều biến thể dựa trên độ dốc ngẫu nhiên của các thuật toán phổ biến, như SVM, đã xuất hiện có khả năng xử lý điều đó.

Scikit cung cấp hỗ trợ cho một số thuật toán này (SVM, kNN, kmeans, ...). Tôi đoán đồ thị đẹp này có thể giúp bạn nhanh chóng tìm ra, nếu scikit có ý nghĩa với bạn.

Mong rằng sẽ giúp

LƯU Ý: phần tiếp theo là phản hồi về nhận xét của zelazny7

Bây giờ tôi đã hiểu bạn. Những gì bạn đang tìm kiếm là gấu trúc . Hãy xem phần nói chuyện. Có một bài thuyết trình so sánh quy trình làm việc của Panda và gấu trúc một cách ngắn gọn. Panda cho phép bạn nhập dữ liệu ở các định dạng khác nhau và xử lý các tệp bgu thông qua tích hợp bảng HDF5 . Bên cạnh đó, bạn có thể giao diện Scikit.


Cảm ơn! Các thuật toán chắc chắn sẽ phải làm việc on-linehoặc trên các khối dữ liệu đọc vào bộ nhớ và ghi lại vào đĩa. Scikit rất tuyệt và đó thực sự là những gì tôi YÊU sử dụng, nhưng những công cụ / luồng công việc / phương pháp tiếp cận nào tồn tại cho các bước rất cần thiết là khám phá, trộn và chuẩn bị dữ liệu trước khi áp dụng các thuật toán này? Các ngôn ngữ này có thể xử lý các bước này, nhưng tôi thực sự đang tìm một ví dụ thực tế từ một người phải giải quyết những vấn đề này ngoài bộ nhớ.
Zelazny7

Tôi đã chỉnh sửa câu trả lời của mình với những gì bạn đang tìm kiếm (hoặc vì vậy tôi tin!)
jpmuc 27/03/13

2

Bạn đã có vẻ thoải mái với SAS và bộ dữ liệu của bạn đủ nhỏ để lắp RAM, nhưng có lẽ bạn không thể lắp đủ RAM vào máy tính xách tay của mình. Nếu bạn không quan tâm đến việc gắn bó với SAS, vậy còn bạn chỉ cần kết nối với SAS chạy từ xa trên máy tính có nhiều RAM thì sao? Tôi không biết làm thế nào nó hoạt động, nhưng những liên kết này có thể giúp bạn bắt đầu.

Có nhiều lý do tuyệt vời khác để sử dụng Pandas hoặc R, nhưng tôi không nghĩ bạn cần lo lắng về giới hạn bộ nhớ. Nếu bạn không thể chứa đủ bộ nhớ trên máy tính xách tay của mình, hãy chạy phiên bản Python hoặc R ở nơi khác và kết nối với SSH, iPython Notebook hoặc RStudio.


1

Graphchi là tuyệt vời, và có thể xử lý các bộ dữ liệu lớn. Đó là một chút khó khăn để làm việc với, nhưng nó có thể xử lý dữ liệu đồ họa và phi đồ họa.


1

Gần đây tôi đã bắt gặp SFramesGraphLab Tạo. Đây là những thư viện dành cho Python cung cấp loại chức năng mà bạn dường như đang tìm kiếm Từ trang Pypi: "SFrame là một khung dữ liệu ngoài lõi, có thể mở rộng, cho phép bạn làm việc với các bộ dữ liệu lớn hơn dung lượng RAM trên hệ thống của bạn. " Vì vậy, hãy nghĩ về nó như chức năng thao tác dữ liệu và API trong Pandas nhưng không đưa vào tất cả dữ liệu trong bộ nhớ trước. SFrame là miễn phí và nguồn mở theo như tôi biết. Mặt khác, GraphLab xây dựng trên chức năng SFrame để cung cấp các thuật toán để thực hiện phân tích mô tả và dự đoán (học máy) trên dữ liệu được lưu trữ trong SFrames. GraphLab Tạo tạo không phải là miễn phí / nguồn mở, nhưng có giấy phép demo miễn phí. Trong mọi trường hợp, tùy thuộc vào mức độ phức tạp của thuật toán của bạn, SFrame có thể đủ cho bạn.


-1

Bạn đã từng xem một ngôn ngữ "thực", không được giải thích như Fortran chưa?

Có vẻ như các đề xuất cho đến nay là rất phụ thuộc vào nhà cung cấp hoặc giải thích. Các phương thức được giải thích nổi tiếng là xấu ở các ứng dụng cường độ cao cho bộ nhớ. MatLab có thể là cấp độ ngôn ngữ cao hơn nhiều so với "C" nhưng tối ưu hóa xử lý bộ nhớ trong C có thể khiến nó xử lý các bộ dữ liệu nhanh hơn gấp 100 lần, lớn hơn hàng triệu lần.

Cả "R" và "Python" đều là những ngôn ngữ tuyệt vời, trình độ cao, giàu kỹ thuật và được sử dụng nhiều. Họ cũng được giải thích.

Bạn có thể xem xét một trong những trường hợp R-on-Hadoop. (Rhipe, những người khác) Điều này có lợi thế là có thể dịch R (trình độ cao, dễ lập trình) thành các hướng dẫn MapReduce / Hadoop. Hadoop có thể tạo ra một cụm đa xử lý người nghèo thú vị.

http://www.datadr.org/ <- (liên kết Rhipe)

Fortran đã được phát triển trong nhiều thập kỷ. Nó có xử lý bộ nhớ rất hiệu quả, và biên dịch. Nó cũng có một số thư viện cấp cao hơn nên có thể thực hiện các thao tác rất phức tạp về mặt kỹ thuật khá đơn giản. Tôi có thể làm một CFD đồ chơi trong MatLab, nhưng đối với một cái gì đó thực tế và tự mã hóa, tôi sẽ sử dụng Fortran để xử lý "cục sắt lớn" và một cái gì đó như MatLab hoặc R để trình bày / tóm tắt dữ liệu. Không ai tạo ra phần mềm CFD thương mại có "công cụ" được giải thích thay vì biên dịch. Một số nhà cung cấp có CFD người kiếm tiền của họ được mã hóa bằng C hoặc Fortran. SAS ban đầu được viết bằng C ( liên kết ).

Fortran và Rhipe có thể truy cập. MatLab tốn tiền và nếu công việc của tôi không trả tiền thì tôi sẽ sử dụng R hoặc Python ngay bây giờ.

CẬP NHẬT: Quan
điểm của tôi đã được "tổng hợp". Python có cython có thể chạy cùng một mã (cơ bản) nhanh hơn ~ 1000 lần. Điều đó có nghĩa là bạn có thể có dữ liệu lớn hơn ~ 1000 lần và xử lý dữ liệu đó gần như cùng một lúc. Để Cython hoạt động sạch sẽ có thể là một thách thức, nhưng các công cụ như " Sage " bao bọc nó rất tốt. Rcpp bị cáo buộc có điểm tương tự, nhưng cá nhân tôi không biết rằng nó cũng được phát triển.

Nếu bạn nghĩ về nó, các nguyên tắc cơ bản của gần như mọi thứ bạn chạy trong máy tính khoa học, ngay cả trong các ngôn ngữ được giải thích đều được biên soạn Fortran hoặc biên dịch C. BLAS là BLAS; bạn không phát minh lại mã mỗi khi bạn làm EDA . Ngôn ngữ thông dịch của bạn đang gọi các thư viện đó, mặc dù rất không hiệu quả, khi nó chạy.

Ở một bên, bạn có thể nhìn vào JMP . Nó có giao diện rất dễ sử dụng và rất tuyệt vời để phân tích dữ liệu khám phá rất trực quan ( EDA ).


2
Làm thế nào để bạn khám phá dữ liệu với một ngôn ngữ được biên dịch như fortran? Đối với tôi, sự hấp dẫn của các ngôn ngữ được giải thích là REPL cung cấp khả năng hướng nội phong phú và cho phép tôi nhanh chóng tìm hiểu những gì tôi đang xử lý cũng như chơi với các chức năng thư viện mới mà tôi có thể không quen thuộc.
Zelazny7

1
Rcpp được phát triển rất tốt (chỉ cần kiểm tra cách sử dụng ngược trên CRAN), nhưng không thực sự có thể so sánh với cython. Nếu bạn có một số chức năng được xác định, vâng, bạn có thể lấy đầu vào R, xử lý nó trong Cpp và trả lại dữ liệu cho R. Nhưng bạn sẽ không sớm biên dịch toàn bộ tập lệnh R thành Cpp.
russellpierce
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.