![](/img/trans.png)
[英]Reading large csv file with missing data using bigmemory package in R
[英]Reading 40 GB csv file into R using bigmemory
標題在這里非常自我解釋,但我將詳細說明如下。 一些在攻擊這個問題我目前的技術是基於中提出的解決方案, 這個問題。 但是,我面臨着一些挑戰和限制,所以我想知道是否有人可能會試圖解決這個問題。 我試圖用bigmemory包解決問題,但我遇到了困難。
目前的限制:
挑戰
到目前為止,結果並不好。 顯然,我在某些事情上失敗了,或許,我只是不太了解大記憶文檔 。 所以,我想我會問這里是否有人使用過
有關此攻擊線的任何提示,建議等? 或者我應該改變別的嗎? 如果這個問題與之前的問題非常相似,我很抱歉,但我認為數據規模比以前的問題大20倍。 謝謝 !
我不知道bigmemory
,但是為了滿足你的挑戰,你不需要讀取文件。只需管道一些bash / awk / sed / python /無論處理什么來執行你想要的步驟,即拋出NULL
行和隨機選擇N
行,然后讀入。
這是一個使用awk的例子(假設您需要來自具有1M行的文件的100個隨機行)。
read.csv(pipe('awk -F, \'BEGIN{srand(); m = 100; length = 1000000;}
!/NULL/{if (rand() < m/(length - NR + 1)) {
print; m--;
if (m == 0) exit;
}}\' filename'
)) -> df
這不是明顯給我你的意思NULL
,所以我用它的字面理解,但應該很容易修改,以滿足您的需求。
這是從大文本文件中采樣挑戰的純R解決方案; 它具有繪制正好n的隨機樣本的額外優點。 盡管將行解析為字符向量並且這相對較慢,但效率並不太低。
我們從一個函數簽名開始,我們提供一個文件名,我們想要繪制的樣本的大小,隨機數生成器的種子(以便我們可以重現我們的隨機樣本!),指示是否有一個頭行,然后,我們將用它來分析樣品進入由R看到的物體,包括額外的參數的“讀者”的功能...
是閱讀器功能可能需要
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()
下一步是讀入一大塊n行,初始化所看到的總行數的計數器
buf <- readLines(con, n)
n_tot <- length(buf)
繼續讀取n行的塊,在沒有進一步輸入時停止
repeat {
txt <- readLines(con, n)
if ((n_txt <- length(txt)) == 0L)
break
對於每個塊,繪制n_keep
行的樣本, n_keep
行數與當前塊中總行數的比例成比例。 這可確保在文件上均勻采樣行。 如果沒有要保留的行,請移動到下一個塊。
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, ...)
}
通過使用readBin
並搜索Simon Urbanek在R-devel 郵件列表中建議的換行符,可以提高解決方案的效率,但有點復雜。 這是完整的解決方案
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, ...)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.