Đây là một giải pháp R thuần túy đối với thử thách lấy mẫu từ một tệp văn bản lớn; nó có thành tích bổ sung để vẽ một mẫu ngẫu nhiên chính xác n. Nó không phải là quá không hiệu quả, mặc dù dòng được phân tích cú pháp để vector nhân vật và điều này là tương đối chậm.
Chúng tôi bắt đầu với chữ ký hàm, trong đó chúng tôi cung cấp tên tệp, kích thước của mẫu chúng tôi muốn vẽ, hạt giống cho trình tạo số ngẫu nhiên (để chúng tôi có thể tạo lại mẫu ngẫu nhiên!), Chỉ số cho biết có một dòng tiêu đề, và sau đó một "đầu đọc" chức năng mà chúng ta sẽ sử dụng để phân tích các mẫu vào đối tượng nhìn thấy bởi R, bao gồm lập luận thêm ...
rằng chức năng đọc có thể cần
fsample <-
function(fname, n, seed, header=FALSE, ..., reader=read.csv)
{
các hạt giống chức năng máy phát điện số ngẫu nhiên, mở ra một kết nối, và đọc trong (không bắt buộc) dòng tiêu đề
set.seed(seed)
con <- file(fname, open="r")
hdr <- if (header) {
readLines(con, 1L)
} else character()
bước tiếp theo là để đọc trong một đoạn của dòng n, khởi tạo một bộ đếm tổng số các dòng được thấy
buf <- readLines(con, n)
n_tot <- length(buf)
Tiếp tục đọc trong khối của dòng n, dừng lại khi không có đầu vào tiếp tục
repeat {
txt <- readLines(con, n)
if ((n_txt <- length(txt)) == 0L)
break
Đối với mỗi đoạn, vẽ một mẫu n_keep
dòng, với số dòng tương ứng với phần của tổng số dòng trong đoạn hiện tại. Điều này đảm bảo rằng các dòng được lấy mẫu thống nhất trên tệp. Nếu không có đường để giữ, hãy di chuyển đến đoạn tiếp theo.
n_tot <- n_tot + n_txt
n_keep <- rbinom(1, n_txt, n_txt/n_tot)
if (n_keep == 0L)
next
Chọn dòng giữ lại, và các đường để thay thế, và cập nhật bộ đệm
keep <- sample(n_txt, n_keep)
drop <- sample(n, n_keep)
buf[drop] <- txt[keep]
}
Khi nhập dữ liệu được thực hiện, chúng tôi phân tích kết quả bằng cách sử dụng đầu đọc và trả kết quả
reader(textConnection(c(hdr, buf), header=header, ...)
}
Giải pháp có thể được thực hiện hiệu quả hơn, nhưng phức tạp hơn một chút, bằng cách sử dụng readBin
và tìm kiếm ngắt dòng theo đề xuất của Simon Urbanek trên R-devel mailing list. Đây là giải pháp đầy đủ
fsample <-
function(fname, n, seed, header=FALSE, ..., reader = read.csv)
{
set.seed(seed)
con <- file(fname, open="r")
hdr <- if (header) {
readLines(con, 1L)
} else character()
buf <- readLines(con, n)
n_tot <- length(buf)
repeat {
txt <- readLines(con, n)
if ((n_txt <- length(txt)) == 0L)
break
n_tot <- n_tot + n_txt
n_keep <- rbinom(1, n_txt, n_txt/n_tot)
if (n_keep == 0L)
next
keep <- sample(n_txt, n_keep)
drop <- sample(n, n_keep)
buf[drop] <- txt[keep]
}
reader(textConnection(c(hdr, buf)), header=header, ...)
}
Làm thế nào về mẫu nội dung tệp? –
Trường hợp chính xác bạn đang thất bại? Loại dữ liệu nào nằm trong tệp .csv - có phải là tất cả 'double's,' int's hay không? Các mục 'NULL' được thể hiện trong tệp như thế nào? Có tên hàng/cột không? Và, bạn đã thử cái gì? Với một .csv của cấu trúc thích hợp, 'read.big.matrix' sẽ đưa bạn đến đó. –
Thông tin thêm sẽ tốt, nhưng tại sao không nhập nó vào SQL, thực hiện một số chuẩn bị ở đó và sau đó tải nó vào R? –