2010-07-27 35 views
9

Tôi đã đạt đến giới hạn RAM trong việc phân tích các tập dữ liệu lớn trong R. Tôi nghĩ bước tiếp theo của tôi là nhập dữ liệu này vào cơ sở dữ liệu MySQL và sử dụng gói RMySQL. Phần lớn là vì tôi không biết lingo cơ sở dữ liệu, tôi không biết cách cài đặt MySQL với giờ Googling và RSeeking (Tôi đang chạy MySQL và MySQL Workbench trên Mac OSX 10.6, nhưng cũng có thể chạy Ubuntu 10.04).Thiết lập cơ sở dữ liệu lớn trong MySQL để phân tích trong R

Có một tham chiếu hay về cách bắt đầu với việc sử dụng này không? Tại thời điểm này tôi không muốn làm bất kỳ loại dữ liệu quan hệ nào. Tôi chỉ muốn nhập các tệp .csv vào cơ sở dữ liệu MySQL cục bộ và thực hiện việc subsetting với RMySQL.

Tôi đánh giá cao bất kỳ con trỏ (bao gồm cả "Cậu là cách tắt cơ sở!" Như tôi mới vào R và mới hơn để tập hợp dữ liệu lớn ... cái này là khoảng 80 mb)

+2

Nếu bạn đang đi để là người duy nhất truy cập vào cơ sở dữ liệu của bạn, sqlite có thể là một lựa chọn tốt (và ít rắc rối hơn để thiết lập) ... Ngoài ra, 80mb không có vẻ giống như một tập dữ liệu rất lớn - bạn có thể cho chúng tôi một ví dụ mà bạn hết RAM? –

+3

Đồng ý, 80 Mb thực tế là không có gì. Có lẽ có một số vấn đề khác với máy hoặc mã của bạn? – neilfws

+0

@Aaron, @Neil - Bạn nói đúng. Nhìn lại điều này với một giấc ngủ ngắn, bộ dữ liệu của tôi không lớn, chỉ lớn hơn những gì tôi đã làm trong quá khứ. 80> 2, nhưng gb >> mb, vì vậy tôi cần phải đi qua mã một lần nữa (và tăng sự kiên nhẫn của tôi). Cảm ơn. –

Trả lời

6

Các tài liệu cho RMySQL là khá tốt - nhưng nó giả định rằng bạn biết những điều cơ bản của SQL. Đó là:

  • tạo ra một cơ sở dữ liệu
  • tạo một bảng
  • nhận được dữ liệu vào bảng
  • lấy dữ liệu ra khỏi bảng

Bước 1 là đơn giản: trong MySQL console , chỉ cần "tạo cơ sở dữ liệu DBNAME". Hoặc từ dòng lệnh, sử dụng mysqladmin hoặc thường có GUI quản trị MySQL.

Bước 2 khó hơn một chút vì bạn phải chỉ định trường bảng và loại của chúng. Điều này sẽ phụ thuộc vào nội dung của tệp CSV của bạn (hoặc được phân cách khác). Một ví dụ đơn giản sẽ giống như thế:

use DBNAME; 
create table mydata(
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    height FLOAT(3,2) 
); 

Mà nói tạo ra một bảng với 2 lĩnh vực: id, đó sẽ là khóa chính (như vậy có phải là duy nhất) và sẽ autoincrement như kỷ lục mới được bổ sung; và chiều cao, ở đây được chỉ định là phao (loại số), có tổng 3 chữ số và 2 sau dấu thập phân (ví dụ: 100,27). Điều quan trọng là bạn hiểu được data types.

Bước 3 - có nhiều cách khác nhau để nhập dữ liệu vào bảng. Một trong những cách dễ nhất là sử dụng tiện ích mysqlimport. Trong ví dụ trên, giả sử dữ liệu của bạn nằm trong một tệp có cùng tên với bảng (mydata), cột đầu tiên là ký tự tab và biến thứ hai chiều cao (không có hàng tiêu đề), điều này sẽ hoạt động:

mysqlimport -u DBUSERNAME -pDBPASSWORD DBNAME mydata 

Bước 4 - yêu cầu bạn biết cách chạy truy vấn MySQL. Một lần nữa, một ví dụ đơn giản:

select * from mydata where height > 50; 

Có nghĩa là "tìm nạp tất cả các hàng (id + chiều cao) từ bảng mydata nơi chiều cao lớn hơn 50".

Khi bạn đã nắm vững những điều cơ bản đó, bạn có thể chuyển sang các ví dụ phức tạp hơn như tạo 2 hoặc nhiều bảng và chạy truy vấn tham gia dữ liệu từ mỗi.

Sau đó - bạn có thể chuyển sang hướng dẫn RMySQL.Trong RMySQL, bạn thiết lập kết nối cơ sở dữ liệu, sau đó sử dụng cú pháp truy vấn SQL để trả về các hàng từ bảng dưới dạng một khung dữ liệu. Vì vậy, nó thực sự quan trọng là bạn nhận được phần SQL - phần RMySQL là dễ dàng.

Có rất nhiều hướng dẫn về MySQL và SQL trên web, bao gồm cả "chính thức" tutorial tại trang web MySQL. Chỉ cần Google tìm kiếm "mysql tutorial".

Cá nhân, tôi không coi 80 Mb là một tập dữ liệu lớn; Tôi ngạc nhiên rằng điều này gây ra vấn đề về RAM và tôi chắc chắn rằng các hàm R gốc có thể xử lý nó khá dễ dàng. Nhưng tốt hơn là học các kỹ năng mới như SQL, ngay cả khi bạn không cần chúng cho vấn đề này.

+0

@ Neil - Cảm ơn các con trỏ! Các bước 1-3 đã trốn tránh tôi, phần lớn là vì tôi đã được sửa chữa trên MySQL Workbench (và tôi không nghĩ rằng tôi có thể làm điều này từ đó). –

2

Gói sqldf có thể cung cấp cho bạn cách dễ dàng hơn để thực hiện những gì bạn cần: http://code.google.com/p/sqldf/. Đặc biệt nếu bạn là người duy nhất sử dụng cơ sở dữ liệu.

Edit: Đây là lý do tại sao tôi nghĩ rằng nó sẽ hữu ích trong trường hợp này (từ trang web):

Với sqldf người dùng sẽ được giải phóng khỏi cần phải làm như sau, tất cả đều được thực hiện tự động:

  • thiết lập cơ sở dữ liệu
  • viết tạo bảng biểu trong đó xác định mỗi bảng
  • nhập khẩu và xuất khẩu đến và đi từ các cơ sở dữ liệu
  • ép buộc của các cột trở lại lớp thích hợp trong trường hợp chung

Xem thêm ở đây: Quickly reading very large tables as dataframes in R

+2

sqldf là tốt - nếu bạn biết SQL. Mặc dù, khi bạn nói với R gurus về sqldf, họ chỉ nhìn bạn như thể bạn đang điên. Có các hàm R gốc để "nối" và các khung dữ liệu tập hợp con; sqldf dành cho những người biết SQL tốt hơn R. – neilfws

+1

sqldf cũng tự động thiết lập cơ sở dữ liệu từ một tệp lớn và cho phép bạn dễ dàng nhập dữ liệu từ nó, giải quyết vấn đề RAM. –

+0

Câu trả lời từ JD Long có thể chỉ là những gì tôi cần! Hôm nay tôi sẽ thử cả SQLdf và RMySQL! Cảm ơn bạn đã giúp đỡ! –

5

Tôi có một gợi ý khá tốt. Đối với 80MB sử dụng SQLite. SQLite là một cơ sở dữ liệu dựa trên tệp siêu công cộng, nhẹ, siêu nhanh, hoạt động (gần như) giống như một cơ sở dữ liệu SQL. http://www.sqlite.org/index.html

Bạn không phải lo lắng về việc chạy bất kỳ loại máy chủ hoặc quyền nào, xử lý cơ sở dữ liệu của bạn chỉ là một tệp.

Ngoài ra, nó lưu trữ tất cả dữ liệu dưới dạng một chuỗi, vì vậy bạn thậm chí không phải lo lắng về việc lưu trữ dữ liệu dưới dạng các loại (vì tất cả những gì bạn cần làm là mô phỏng một bảng văn bản).

người khác đề cập sqldf: http://code.google.com/p/sqldf/

mà tương tác với SQLite: http://code.google.com/p/sqldf/#9._How_do_I_examine_the_layout_that_SQLite_uses_for_a_table?_whi

Vì vậy, SQL của bạn tạo ra tuyên bố sẽ là như thế này

create table tablename (
    id INT(11) INTEGER PRIMARY KEY, 
    first_column_name TEXT, 
    second_column_name TEXT, 
    third_column_name TEXT 
); 

Nếu không, giải thích neilfws' là một khá tốt.

P.S. Tôi cũng hơi ngạc nhiên khi kịch bản của bạn bị nghẹt thở trên 80mb. Nó không thể trong R để chỉ tìm kiếm thông qua các tập tin trong khối mà không cần mở nó tất cả trong bộ nhớ?

1

Tôi đồng ý với những gì đã được nói cho đến thời điểm này. Mặc dù tôi đoán bắt đầu với MySQL (cơ sở dữ liệu) nói chung không phải là một ý tưởng tồi cho lâu nếu bạn đang đi để đối phó với dữ liệu. Tôi có nghĩa là tôi đã kiểm tra hồ sơ của bạn mà nói sinh viên tiến sĩ tài chính. Tôi không biết điều đó có nghĩa là lượng tử hay không.tài chính, nhưng có khả năng bạn sẽ gặp các tập dữ liệu thực sự lớn trong sự nghiệp của bạn. Tôi bạn có thể đủ khả năng một thời gian, tôi sẽ khuyên bạn nên tìm hiểu một cái gì đó về cơ sở dữ liệu. Nó chỉ giúp. Tài liệu của MySQL chính nó là khá vững chắc và bạn có thể có rất nhiều trợ giúp bổ sung (cụ thể) tại đây tại SO.

Tôi chạy MySQL với bàn làm việc MySQL trên Mac OS X Snow Leopard. Vì vậy, đây là những gì đã giúp tôi để có được nó thực hiện tương đối dễ dàng.

  • Tôi đã cài đặt MAMP, mang đến cho một máy chủ web Apache địa phương của tôi với PHP, MySQL và các công cụ MySQL PHPMyAdmin, có thể được sử dụng như là một thay thế webbased tốt đẹp cho MySQL workbench (mà không phải lúc nào cũng siêu ổn định trên máy Mac :). Bạn sẽ có một widget nhỏ để khởi động và dừng các máy chủ và có thể truy cập một số cài đặt cấu hình cơ bản (như các cổng thông qua trình duyệt của bạn). Nó thực sự là một cú nhấp chuột cài đặt ở đây.

  • Cài đặt Rpackage RMySQL. Tôi sẽ đặt chuỗi kết nối của tôi ở đây, có thể giúp:

  • Tạo cơ sở dữ liệu của bạn bằng bàn làm việc MySQL. INT và VARCHAR (đối với các biến phân loại có chứa các ký tự) nên là các kiểu trường mà bạn cần về cơ bản ngay từ đầu.

  • Cố gắng tìm thói quen nhập phù hợp nhất với bạn. Tôi không biết nếu bạn là một người đàn ông vỏ/thiết bị đầu cuối - nếu như vậy bạn sẽ thích những gì đã được đề xuất bởi neilfws. Bạn cũng có thể sử dụng LOAD DATA INFILE đó là tôi thích vì nó chỉ có một truy vấn như trái ngược với INSERT INTO (từng dòng)

Nếu bạn chỉ định những vấn đề mà bạn có chính xác hơn, bạn sẽ nhận được một số giúp đỡ cụ thể hơn - vì vậy hãy thoải mái hỏi;)

Tôi giả sử bạn phải làm việc rất nhiều với time series data - có một project (TSMySQL) xung quanh sử dụng R và cơ sở dữ liệu quan hệ (chẳng hạn như MySQL, nhưng cũng có sẵn cho các DBMS khác) dữ liệu. Bên cạnh đó bạn thậm chí có thể kết nối R với FAME (vốn phổ biến trong số các nhà tài trợ, nhưng đắt tiền). Đoạn cuối chắc chắn là không có gì cơ bản, nhưng tôi nghĩ nó có thể giúp bạn cân nhắc xem liệu nó có đáng để hối hả đi sâu vào nó sâu hơn một chút không.

+0

Cảm ơn các con trỏ Mac! Tôi nghĩ rằng các bước 1-3 của Neil sẽ giúp tôi đi, nhưng tôi sẽ quay trở lại nếu có bất kỳ trục trặc nào của Mac. Và không phải là tất cả định lượng tài chính? ;) –

+0

@richardh, dunno về phần tài chính, bạn là chuyên gia;). –

0

Practical Computing for Biologists như một đẹp (mặc dù đối tượng cụ thể) giới thiệu về SQLite

Chương 15. Tổ chức và cơ sở dữ liệu dữ liệu

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