2017-10-17 4 views
0

私は非常に大きなマルチギガバイトのファイルを持っており、メモリにロードするには高価です。ただし、ファイル内の行の順序はランダムではありません。 freadのようなものを使って行のランダムな部分集合を読み込む方法はありますか?R:freadまたは同等物を使用してファイルからランダムな行を読み込みますか?

たとえば、次のようなものがありますか?

data <- fread("data_file", nrows_sample = 90000) 

このgithub postは一つの可能​​性は、このような何かを行うことであることを示唆している:

fread("shuf -n 5 data_file") 

しかしこれは、私のために動作しません。何か案は?

答えて

1

はtidyverseを使用して(data.tableではなく)、あなたができる:

library(readr) 
library(purrr) 
library(dplyr) 

# generate some random numbers between 1 and how many rows your files has, 
# assuming you can ballpark the number of rows in your file 
# 
# Generating 900 integers because we'll grab 10 rows for each start, 
# giving us a total of 9000 rows in the final 
start_at <- floor(runif(900, min = 1, max = (n_rows_in_your_file - 10))) 

# sort the index sequentially 
start_at <- start_at[order(start_at)] 

# read in 10 rows at a time, starting at your random numbers 
sample_of_rows <- map(start_at, ~read_csv("data_file", n_max = 10, skip = .x)) %>% 
    bind_rows() 
1

データファイルは、パッケージLaFを使用して、このソリューションが有用である可能性がテキストファイルであることを起こる場合:

library(LaF) 

# Prepare dummy data 
mat <- matrix(sample(letters,10*1000000,T), nrow = 1000000) 

dim(mat) 
#[1] 1000000  10 

write.table(mat, "tmp.csv", 
    row.names = F, 
    sep = ",", 
    quote = F) 

# Read 90'000 random lines 
start <- Sys.time() 
random_mat <- sample_lines(filename = "tmp.csv", 
    n = 90000, 
    nlines = 1000000) 
random_mat <- do.call("rbind",strsplit(random_mat,",")) 
Sys.time() - start 
#Time difference of 1.135546 secs  

dim(random_mat) 
#[1] 90000 10 
関連する問題