Bây giờ gấu trúc có nhanh hơn data.table không?


15

https://github.com/Rdatitable/data.table/wiki/Benchmark-%3A-Grouping

Các điểm chuẩn data.table chưa được cập nhật từ năm 2014. Tôi nghe thấy ở đâu đó Pandasnhanh hơn data.table. Điều này có đúng không? Có ai đã làm bất kỳ điểm chuẩn? Tôi chưa bao giờ sử dụng Python trước đây nhưng sẽ xem xét chuyển đổi nếu pandascó thể đánh bại data.table?


7
Đó là một lý do thực sự tồi tệ để chuyển sang python.
Matthew Drury

2
@MatthewDrury làm sao vậy? Dữ liệu và thao tác của nó là 80% công việc của tôi. Chỉ 20% là để phù hợp với mô hình và trình bày. Tại sao tôi không nên chọn kết quả nhanh nhất?
xiaodai

2
Cả python và R đều là những ngôn ngữ được thiết lập với hệ sinh thái và cộng đồng khổng lồ. Để giảm sự lựa chọn cho một thư viện duy nhất là thờ một cây duy nhất trong một khu rừng rộng lớn. Mặc dù vậy, tính hiệu quả chỉ là mối quan tâm duy nhất của nhiều người ngay cả đối với một thư viện duy nhất (giao diện biểu cảm như thế nào, kết nối với thư viện khác như thế nào, codebase mở rộng như thế nào, các nhà phát triển của nó mở như thế nào). Tôi sẽ lập luận rằng sự lựa chọn là một sự phân đôi giả; cả hai cộng đồng có một trọng tâm khác nhau, cho vay các ngôn ngữ sức mạnh khác nhau.
Matthew Drury

3
Bạn có một khu rừng khổng lồ tốt cho 20% công việc? vì vậy đừng đưa ra lựa chọn nào ảnh hưởng đến 80% công việc của bạn? không có gì ngăn cản tôi sử dụng gấu trúc để chuẩn bị dữ liệu và sau đó tạo mô hình trong R python hoặc Julia. Tôi nghĩ rằng suy nghĩ của tôi là âm thanh. Nếu gấu trúc nhanh hơn tôi nên chọn nó làm công cụ chính của mình.
xiaodai

1
Bạn có thể tìm ra có hình mặt lưới gói vào R của lãi / sử dụng. Ngoài ra, ngày càng nhiều nỗ lực đã được đưa vào để R hoạt động / chơi với cơ sở dữ liệu (xem các nỗ lực như dbplyr ).
slackline

Câu trả lời:


13

Một đồng nghiệp và tôi đã thực hiện một số nghiên cứu sơ bộ về sự khác biệt hiệu suất giữa gấu trúc và data.table. Bạn có thể tìm thấy nghiên cứu (được chia thành hai phần) trên Blog của chúng tôi (Bạn có thể tìm thấy phần hai ở đây ).

Chúng tôi đã tìm ra rằng có một số nhiệm vụ trong đó gấu trúc rõ ràng vượt trội so với data.table, nhưng cũng có trường hợp data.table nhanh hơn nhiều. Bạn có thể tự kiểm tra và cho chúng tôi biết bạn nghĩ gì về kết quả.

EDIT:
Nếu bạn không muốn đọc blog chi tiết, đây là một bản tóm tắt ngắn về thiết lập của chúng tôi và những phát hiện của chúng tôi:

Thiết lập

Chúng tôi đã so sánh pandasdata.tabletrên 12 bộ dữ liệu mô phỏng khác nhau về các hoạt động sau (cho đến nay), mà chúng tôi gọi là các kịch bản.

  • Truy xuất dữ liệu với thao tác giống như chọn
  • Lọc dữ liệu với thao tác chọn có điều kiện
  • Thao tác sắp xếp dữ liệu
  • Hoạt động tổng hợp dữ liệu

Các tính toán được thực hiện trên một máy có Intel i7 2.2GHz với 4 lõi vật lý, RAM 16 GB và ổ cứng SSD. Các phiên bản phần mềm là OS X 10.13.3, Python 3.6.4 và R 3.4.2. Các phiên bản thư viện tương ứng được sử dụng là 0,22 cho gấu trúc và 1,10,4-3 cho data.table

Kết quả một cách ngắn gọn

  • data.tabledường như nhanh hơn khi chọn cột ( pandastrung bình mất thêm 50% thời gian)
  • pandas nhanh hơn trong việc lọc các hàng (trung bình khoảng 50%)
  • data.tabledường như nhanh hơn đáng kể trong việc sắp xếp ( pandasđôi khi chậm hơn 100 lần)
  • thêm một cột mới xuất hiện nhanh hơn với pandas
  • kết quả tổng hợp là hỗn hợp hoàn toàn

Xin lưu ý rằng tôi đã cố gắng đơn giản hóa kết quả càng nhiều càng tốt để không làm bạn chán đến chết. Để hình dung đầy đủ hơn hãy đọc các nghiên cứu. Nếu bạn không thể truy cập trang web của chúng tôi, xin vui lòng gửi cho tôi một tin nhắn và tôi sẽ chuyển tiếp cho bạn nội dung của chúng tôi. Bạn có thể tìm thấy mã cho nghiên cứu hoàn chỉnh trên GitHub . Nếu bạn có ý tưởng làm thế nào để cải thiện việc học của chúng tôi, xin vui lòng gửi email cho chúng tôi. Bạn có thể tìm thấy địa chỉ liên lạc của chúng tôi trên GitHub.


1
Như bạn có thể đã đọc từ câu trả lời của tôi, tôi đã nói rằng kết quả là hỗn hợp. Vui lòng làm rõ nếu tôi sẽ cụ thể hơn trong câu trả lời của mình, có khả năng xây dựng trên một số con số.
Tobias Krabel

1
"Quyền truy cập của bạn vào trang web này đã bị giới hạn." Tôi dường như không thể truy cập trang web trên điện thoại cũng như trên máy tính làm việc của mình.
xiaodai

1
Tôi rất tiếc khi đọc điều đó. Tôi đã tự kiểm tra nó trên điện thoại và không có vấn đề gì. Có thể có một cái gì đó để làm với đất nước bạn cố gắng kết nối?
Tobias Krabel

1
"4 lõi vật lý" = 8 lõi logic. Ngoài ra, nó còn giúp cho biết Intel i7 2.2GHz cụ thể (thế hệ nào? Biến thể nào? -HQ?) Và kích thước bộ đệm. Và đối với SSD, tốc độ đọc và ghi là gì?
smci

Làm thế nào để họ so sánh với Julia dataframes và JuliaDB?
skan

13

Có ai đã làm bất kỳ điểm chuẩn?

Có, điểm chuẩn bạn đã liên kết trong câu hỏi của bạn đã được cập nhật gần đây cho phiên bản gần đây của data.table và gấu trúc. Ngoài ra, phần mềm khác đã được thêm vào. Bạn có thể tìm thấy điểm chuẩn được cập nhật tại https://h2oai.github.io/db-benchmark
Thật không may, nó được lên lịch trên máy Bộ nhớ 125GB (không phải là 244GB như bản gốc). Kết quả là gấu trúc và dask không thể thực hiện groupbydữ liệu trên 1e9 hàng (50GB csv) vì chúng hết bộ nhớ khi đọc dữ liệu. Vì vậy, đối với gấu trúc vs data.table, bạn phải xem dữ liệu 1e8 hàng (5GB).

Để không chỉ liên kết nội dung bạn đang yêu cầu tôi đang dán thời gian gần đây cho các giải pháp đó.

xin lưu ý rằng những thời gian đó đã lỗi thời,
hãy truy cập https://h2oai.github.io/db-benchmark để biết thời gian cập nhật

| in_rows|question              | data.table| pandas|
|-------:|:---------------------|----------:|------:|
|   1e+07|sum v1 by id1         |      0.140|  0.414|
|   1e+07|sum v1 by id1:id2     |      0.411|  1.171|
|   1e+07|sum v1 mean v3 by id3 |      0.574|  1.327|
|   1e+07|mean v1:v3 by id4     |      0.252|  0.189|
|   1e+07|sum v1:v3 by id6      |      0.595|  0.893|
|   1e+08|sum v1 by id1         |      1.551|  4.091|
|   1e+08|sum v1 by id1:id2     |      4.200| 11.557|
|   1e+08|sum v1 mean v3 by id3 |     10.634| 24.590|
|   1e+08|mean v1:v3 by id4     |      2.683|  2.133|
|   1e+08|sum v1:v3 by id6      |      6.963| 16.451|
|   1e+09|sum v1 by id1         |     15.063|     NA|
|   1e+09|sum v1 by id1:id2     |     44.240|     NA|
|   1e+09|sum v1 mean v3 by id3 |    157.430|     NA|
|   1e+09|mean v1:v3 by id4     |     26.855|     NA|
|   1e+09|sum v1:v3 by id6      |    120.376|     NA|

Trong 4 trên 5 câu hỏi data.table nhanh hơn và chúng ta có thể thấy nó có tỷ lệ tốt hơn.
Chỉ cần lưu ý thời gian này là như bây giờ , ở đâu id1, id2id3là các trường ký tự. Những sẽ được thay đổi sớm để phân loại HOÀN CHỈNH . Bên cạnh đó, có những yếu tố khác có khả năng ảnh hưởng đến những khoảng thời gian đó trong tương lai gần (như nhóm trong DONE song song ). Chúng tôi cũng sẽ thêm các điểm chuẩn riêng cho dữ liệu có NAcác thông số khác nhau DONE .

Các nhiệm vụ khác đang đến với dự án điểm chuẩn liên tục này vì vậy nếu bạn đang quan tâm join, sort, readvà những người khác hãy chắc chắn để kiểm tra nó sau này.
Và tất nhiên bạn được chào đón để cung cấp thông tin phản hồi trong repo dự án!


1
JuliaDB thì sao?
skan

1
@skan bạn có thể theo dõi trạng thái của điều đó trong github.com/h2oai/db-benchmark/issues/63
jangorecki 17/12/18

1
Câu trả lời hay - AFAICT các điểm chuẩn mà bạn liên kết đều chạy trên cùng một VM? Đó là, trong cùng điều kiện, gấu trúc và dask cần hơn 128 GB RAM cho bảng 50 GB, trong khi những người khác có thể thực hiện theo ràng buộc này? Nếu vậy, nó cũng phản ánh những trải nghiệm của tôi với gấu trúc rất kém hiệu quả đối với rất nhiều vật dụng thông thường hàng ngày trên các bảng vừa phải (~ 10GB) và đó là vấn đề lớn hơn nhiều so với tốc độ thực thi. (gần hơn và giao dịch qua lại trong bất kỳ sự kiện nào tùy thuộc vào khối lượng công việc cụ thể.)
jkf

@jkf vâng, chính xác. Máy có bộ nhớ 128 GB vì chúng tôi đang có kế hoạch kiểm tra xử lý mem trên bộ dữ liệu 500 GB (10e9 hàng). Hiện tại chỉ có tia lửa và pydatitable sẽ hỗ trợ điều đó, cũng sẽ sớm được thêm vào clickhouse.
jangorecki

@jangorecki đó là một điểm chuẩn cực kỳ hữu ích. Cảm ơn rất nhiều vì sự nỗ lực. Tôi hơi bối rối về việc không thể tiêu hóa bộ dữ liệu 50GB. Dask có kích thước phân vùng là một trong các tham số (ví dụ: blocksizetrong read_csv). Bạn đã cố gắng tránh gọi compute()và kết xuất đầu ra vào đĩa để tránh lắp ráp toàn bộ bảng đầu ra trong bộ nhớ?
Mykhailo Lisovyi

3

Không, trong thực tế nếu kích thước tập dữ liệu rất lớn mà gấu trúc gặp sự cố, về cơ bản bạn bị mắc kẹt với dask, nó hút và bạn thậm chí không thể thực hiện một nhóm đơn giản. dplyr có thể không nhanh, nhưng nó không gây rối.

Tôi hiện đang làm việc trên một số tập dữ liệu 2G nhỏ và một print(df.groupby(['INCLEVEL1'])["r"].sum())sự cố đơn giản .

Không gặp lỗi này với dplyr.

Vì vậy, nếu gấu trúc có thể xử lý tập dữ liệu, tôi sử dụng gấu trúc, nếu không, hãy bám vào bảng dữ liệu R.

Và vâng, bạn có thể chuyển đổi dask trở lại dataframe một cách đơn giản df.compute() Nhưng phải mất một thời gian khá dài, vì vậy bạn cũng có thể kiên nhẫn chờ đợi gấu trúc tải hoặc đọc dữ liệu để đọc.


1
Không biết Dask rất tệ. Có lẽ bạn muốn dùng thử đĩa của R. github.com/xiaodaigh/disk.frame Tôi là tác giả
xiaodai

1

Tôi biết đây là một bài viết cũ hơn, nhưng hình dung nó có thể đáng được đề cập - sử dụng Feather (trong R và trong Python) cho phép hoạt động trên các khung dữ liệu / bảng dữ liệu và chia sẻ các kết quả đó thông qua Feather.

Xem trang github của lông


Phân đoạn cho các bộ dữ liệu vừa và lớn
jangorecki
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.