同理心
樣本大概是10,5,35個, 考慮到人類的基因大概有2w多個,那麼這就是乙個10000 x 20000的大樣本資料,鑑於這還是乙個tpm,資料型別是浮點型,檔案解壓縮之後就是4.61g, 如果全部載入到r語言中,大部分的電腦估計都受不了
library(pryr)
test
object_size(test)
# 5.11 gb
考慮到並非所有資料都是我們所需要的,是否可以只讀取部分的資料呢?原作者的解決方案是通過r呼叫命令列的方式,提取部分資料,然後讓r語言進行載入。
system命令
可是大部分人的作業系統都是windows,所有執行的時候就會報錯,能不能就使用者r語言解決這個問題呢?當然可以,只要你認真讀過read.table
的那麼多引數,你就會知道他的那麼多引數並不是裝飾用的。
讓我們先學習乙個簡單的引數nrows
, 他的作用就是讀取前n行,知道它之後,那就不需要去呼叫head
了
headtcga
sep = "\t",
stringsasfactors = false,
nrow = 1)
效果就是讀取第一行,構建乙個資料框,然後將其轉成向量。但既然目標是向量,其實還有另一種實現方案,readlines
讀取的就是乙個字串,然後將其分隔成向量即可。
headtcga
headtcga
讀取指定列會稍微困難一些,因為colclasses
不太好理解。r語言在用read.table
讀取資料的時候其實做了很多事情,有一件事情就是負責確認每一列的資料型別,r語言需要根據不同資料型別進行記憶體分配。
如果你想實現讀取指定列,那麼你就得自己去設定每一列的資料型別。如果哪些列不需要,就將其它的資料型別定義為null,r語言就會忽略它。
讀取**如下:
cat(paste0("begin at ", sys.time(),"\n"))
first_5_rows
stringsasfactors = false,
header = false,
skip = 1,
check.names = false)
# targetnum 你需要讀取的列
classes[-targetnum]
classes[1]
# 讀取檔案(跳過第一行)
targetcancertpm
sep= "\t",
skip = 1,
colclasses = classes)
colnames(targetcancertpm)
targetcancertpm[1:3, 1:3]
cat(paste0("end at ", sys.time(),"\n"))
如果僅讀取我們需要的列的話,最終只消耗了500m的記憶體,相對於之前的5g記憶體,減少了將近10倍。
這就是需要對檔案進行逐行讀取解析了,我用readlines
造了乙個輪子,函式名為read_part
,目前能用的引數為
# 函式目標:
# 讀取檔案中的指定行和指定列
# 不包括注釋行
read_part
stringsasfactors = false,
header = false,
check.names = false,
comment.char = "#", ...) else
i j
repeat else
#print(select_cols)
dfl[[j]]
j } close(con)
df return(df)
}
獲取遠端大檔案部分內容的方法
獲取遠端大檔案部分內容的方法 一些其它介紹可以移步 或者直接檢視rfc 我們使用檔案記錄上次訪問的位置,下次直接從這個位置訪問 使用php的fsockopen函式實現獲取大檔案部分內容的 如下 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 26...
讀取csv檔案裡面部分內容(email,name)
static void main directoryinfo info new directoryinfo spath filesysteminfo fsinfo info.getfilesysteminfos filestream fs new filestream filename,system...
C語言修改檔案某部分內容
兩種方法 1.全部讀入記憶體 修改後重新存入檔案 2.邊讀邊寫到另一新建檔案 要修改的部分修改後存入新建檔案 其他部分原封不動寫入 寫完刪掉原先檔案 將這個新的改為刪掉那個的名字 方法一 讀入記憶體修改 然後重新寫入檔案 include include main linedata 100 file ...