簡體   English   中英

使用bigmemory將40 GB csv文件讀入R中

[英]Reading 40 GB csv file into R using bigmemory

標題在這里非常自我解釋,但我將詳細說明如下。 一些在攻擊這個問題我目前的技術是基於中提出的解決方案, 這個問題。 但是,我面臨着一些挑戰和限制,所以我想知道是否有人可能會試圖解決這個問題。 我試圖用bigmemory包解決問題,但我遇到了困難。

目前的限制:

  • 使用具有16 GB RAM的Linux服務器
  • 大小為40 GB CSV
  • 行數:67,194,126,114

挑戰

  • 需要能夠從big.matrix或等效數據結構中隨機采樣較小的數據集(5-10百萬行)。
  • 在解析為big.matrix或等效數據結構時,需要能夠使用單個NULL實例刪除任何行。

到目前為止,結果並不好。 顯然,我在某些事情上失敗了,或許,我只是不太了解大記憶文檔 所以,我想我會問這里是否有人使用過

有關此攻擊線的任何提示,建議等? 或者我應該改變別的嗎? 如果這個問題與之前的問題非常相似,我很抱歉,但我認為數據規模比以前的問題大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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM