Tôi đang đọc dữ liệu rất nhanh bằng cách sử dụng arrow
gói mới . Nó xuất hiện ở giai đoạn khá sớm.
Cụ thể, tôi đang sử dụng định dạng cột gỗ . Điều này chuyển đổi trở lại thành data.frame
R, nhưng bạn có thể tăng tốc sâu hơn nữa nếu không. Định dạng này thuận tiện vì nó cũng có thể được sử dụng từ Python.
Trường hợp sử dụng chính của tôi cho việc này là trên một máy chủ RShiny khá hạn chế. Vì những lý do này, tôi thích giữ dữ liệu được đính kèm với Ứng dụng (nghĩa là ngoài SQL) và do đó yêu cầu kích thước tệp nhỏ cũng như tốc độ.
Bài viết liên kết này cung cấp điểm chuẩn và một cái nhìn tổng quan tốt. Tôi đã trích dẫn một số điểm thú vị dưới đây.
https://ursalabs.org/blog/2019-10-columnar-perf/
Kích thước tập tin
Đó là, tệp Parquet lớn bằng một nửa so với CSV được nén. Một trong những lý do khiến tệp Parquet quá nhỏ là do mã hóa từ điển (còn được gọi là từ điển nén nén từ điển). Nén từ điển có thể mang lại khả năng nén tốt hơn đáng kể so với sử dụng máy nén byte có mục đích chung như LZ4 hoặc ZSTD (được sử dụng ở định dạng FST). Sàn gỗ được thiết kế để tạo ra các tệp rất nhỏ để đọc nhanh.
Tốc độ đọc
Khi kiểm soát theo loại đầu ra (ví dụ: so sánh tất cả các đầu ra R data.frame với nhau), chúng ta sẽ thấy hiệu suất của Parquet, Feather và FST nằm trong một phạm vi tương đối nhỏ của nhau. Điều tương tự cũng đúng với các đầu ra pandas.DataFrame. data.table :: fread có khả năng cạnh tranh ấn tượng với kích thước tệp 1,5 GB nhưng thua các tệp khác trên CSV 2,5 GB.
Kiểm tra độc lập
Tôi đã thực hiện một số điểm chuẩn độc lập trên bộ dữ liệu mô phỏng gồm 1.000.000 hàng. Về cơ bản, tôi đã xáo trộn một loạt những thứ xung quanh để thử thách sự nén. Ngoài ra tôi đã thêm một trường văn bản ngắn của các từ ngẫu nhiên và hai yếu tố mô phỏng.
Dữ liệu
library(dplyr)
library(tibble)
library(OpenRepGrid)
n <- 1000000
set.seed(1234)
some_levels1 <- sapply(1:10, function(x) paste(LETTERS[sample(1:26, size = sample(3:8, 1), replace = TRUE)], collapse = ""))
some_levels2 <- sapply(1:65, function(x) paste(LETTERS[sample(1:26, size = sample(5:16, 1), replace = TRUE)], collapse = ""))
test_data <- mtcars %>%
rownames_to_column() %>%
sample_n(n, replace = TRUE) %>%
mutate_all(~ sample(., length(.))) %>%
mutate(factor1 = sample(some_levels1, n, replace = TRUE),
factor2 = sample(some_levels2, n, replace = TRUE),
text = randomSentences(n, sample(3:8, n, replace = TRUE))
)
Đọc và viết
Viết dữ liệu rất dễ dàng.
library(arrow)
write_parquet(test_data , "test_data.parquet")
# you can also mess with the compression
write_parquet(test_data, "test_data2.parquet", compress = "gzip", compression_level = 9)
Đọc dữ liệu cũng dễ dàng.
read_parquet("test_data.parquet")
# this option will result in lightning fast reads, but in a different format.
read_parquet("test_data2.parquet", as_data_frame = FALSE)
Tôi đã thử đọc dữ liệu này dựa trên một số tùy chọn cạnh tranh và đã nhận được kết quả hơi khác so với bài viết ở trên, dự kiến.
Tập tin này không lớn bằng bài viết chuẩn, nên có lẽ đó là sự khác biệt.
Xét nghiệm
- rds: test_data.rds (20,3 MB)
- parquet2_native: (14,9 MB với độ nén cao hơn và
as_data_frame = FALSE
)
- parquet2: test_data2.parquet (14,9 MB với độ nén cao hơn)
- sàn gỗ: test_data.parquet (40,7 MB)
- fst2: test_data2.fst (27,9 MB với độ nén cao hơn)
- fst: test_data.fst (76,8 MB)
- fread2: test_data.csv.gz (23,6 MB)
- đầu: test_data.csv (98,7 MB)
- Feather_arrow: test_data.feather (157,2 MB đọc với
arrow
)
- Feather: test_data.feather (157,2 MB đọc với
feather
)
Quan sát
Đối với tập tin đặc biệt này, fread
thực sự là rất nhanh. Tôi thích kích thước tệp nhỏ từ parquet2
thử nghiệm nén cao . Tôi có thể đầu tư thời gian để làm việc với định dạng dữ liệu gốc hơn là data.frame
nếu tôi thực sự cần tăng tốc.
Đây fst
cũng là một lựa chọn tuyệt vời. Tôi sẽ sử dụng fst
định dạng nén cao hoặc nén cao parquet
tùy thuộc vào việc tôi cần giảm tốc độ hoặc kích thước tệp.