亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

修剪巨大的(3.5 GB)CSV文件以讀入R

修剪巨大的(3.5 GB)CSV文件以讀入R

慕姐4208626 2019-11-05 15:56:24
因此,我有一個數據文件(以分號分隔),該文件包含很多詳細信息和不完整的行(導致Access和SQL阻塞)。它是40年的縣級數據集,細分為細分,子細分和子細分(共200個因子)。簡而言之,它是巨大的,如果我嘗試簡單地閱讀它,它將不適合內存。所以我的問題是,考慮到我想要所有縣,但是只有一年(并且只有最高級別的細分……最終導致約100,000行),什么是獲得該收入的最佳方法?此匯總到R?目前,我正在嘗試與Python無關的事情,通過一次讀取和操作一行來繞過文件大小限制,但是我更喜歡僅R的解決方案(CRAN包可以)。有沒有類似的方法可以一次在R中讀取文件?任何想法將不勝感激。更新:約束條件需要使用我的機器,所以沒有EC2實例盡可能僅R。在這種情況下,速度和資源不是問題...只要我的機器不爆炸...如下所示,數據包含混合類型,稍后我需要對其進行操作數據數據為3.5GB,約850萬行和17列幾千行(?2k)格式錯誤,只有一列而不是17這些完全不重要,可以刪除我只需要該文件中的約100,000行(見下文)數據示例:County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...NC  [Malformed row][8.5 Mill rows]我想刪掉一些列并從40個可用年份(1980-2020年的2009-2010年)中選擇兩個,以便使數據適合R:County; State; Year; Quarter; Segment; GDP; ...Ada County;NC;2009;4;FIRE;80.1; ...Ada County;NC;2010;1;FIRE;82.5; ...[~200,000 rows]結果:修正所有提出的建議后,我決定由JD和Marek提出的readLines效果最好。我給了Marek支票,因為他提供了一個示例實現。我在這里為我的最終答案復制了Marek實現的稍作改編的版本,使用strsplit和cat僅保留我想要的列。還應當指出,這是MUCH比Python效率較低......在,巨蟒通過要吃掉5分鐘3.5GB文件,而R取約60 ...但如果你只為R,那么這是罰單。## Open a connection separately to hold the cursor positionfile.in <- file('bad_data.txt', 'rt')file.out <- file('chopped_data.txt', 'wt')line <- readLines(file.in, n=1)line.split <- strsplit(line, ';')# Stitching together only the columns we wantcat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)## Use a loop to read in the rest of the linesline <- readLines(file.in, n=1)失敗的方法:sqldf如果數據格式正確,這絕對是我以后將使用的此類問題。但是,如果不是,則SQLite會阻塞。MapReduce老實說,文檔使我對此感到有些恐懼,所以我沒有去嘗試它??雌饋硭惨笤搶ο笠惨趦却嬷?,如果是這樣的話,這將使問題無濟于事。大內存這種方法干凈地鏈接到數據,但一次只能處理一種類型。結果,我的所有字符向量在放入big.table時都掉了。但是,如果我需要為將來設計大型數據集,我將考慮僅使用數字只是為了使此選項有效。掃描掃描似乎具有與大內存類似的類型問題,但是具有readLines的所有機制。簡而言之,這一次不符合要求。
查看完整描述

3 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

我的嘗試readLines。這部分代碼是根據csv選定的年份創建的。


file_in <- file("in.csv","r")

file_out <- file("out.csv","a")

x <- readLines(file_in, n=1)

writeLines(x, file_out) # copy headers


B <- 300000 # depends how large is one pack

while(length(x)) {

    ind <- grep("^[^;]*;[^;]*; 20(09|10)", x)

    if (length(ind)) writeLines(x[ind], file_out)

    x <- readLines(file_in, n=B)

}

close(file_in)

close(file_out)


查看完整回答
反對 回復 2019-11-05
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

有沒有類似的方法可以一次在R中讀取文件?


是。的readChar()函數將在字符的塊讀取,而不假定它們是空終止。如果要一次讀取一行中的數據,可以使用readLines()。如果讀取塊或行,請執行操作,然后將數據寫出,可以避免出現內存問題。盡管如果您想在Amazon EC2上啟動大內存實例,則可以獲取高達64GB的RAM。那應該保存您的文件,還有足夠的空間來處理數據。


如果需要更高的速度,那么Shane建議使用Map Reduce是一個很好的建議。但是,如果您打算在EC2上使用大內存實例,則應該查看多核軟件包以使用計算機上的所有內核。


如果您發現自己想將大量帶分隔符的數據讀入R中,則至少應研究sqldf程序包,該程序包可讓您從R中直接導入sqldf,然后對R中的數據進行操作。我發現sqldf是其中之一如上一個問題所述,將大量數據導入R的最快方法。


查看完整回答
反對 回復 2019-11-05
  • 3 回答
  • 0 關注
  • 757 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號