2016-01-21 20 views
1

我想從以下服務器獲得了大量的數據集(3+ GB):如何從FTP服務器上的文件中提取數據而無需在R中全部下載? - 編碼錯誤?

ftp://podaac-ftp.jpl.nasa.gov/allData/ghrsst/data/L4/GLOB/JPL/MUR

我知道RCurl是一個很好的包從FTP獲取數據。該文件是一個壓縮的netcdf文件。我需要解壓縮它才能使用ncdf4將它讀入R中。它被壓縮爲bz2

重要的是,該文件比我想在我的硬盤上大,所以本地保存副本不是一個理想的選擇。我怎樣才能訪問文件上的數據,而不是先保存副本到我的磁盤?

這裏是我的嘗試至今:

library(RCurl); library(ncdf4) 
d = getURL('ftp://podaac-ftp.jpl.nasa.gov/allData/ghrsst/data/L4/GLOB/JPL/MUR/2015/144/20150524-JPL-L4UHfnd-GLOB-v01-fv04-MUR.nc.bz2') 
d = bzfile(d, open = 'r') 
d = nc_open(d) 

但我被困在第一行後,這個神祕的錯誤:

Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : 
    embedded nul in string: 'BZh91AY&SY¦ÁÀÉ\0033[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáåÏ\035\017)³îÎ\u009dÍØcn]sw7½ÎkÜÞõï=uÎׯv]ìçn\u009dÎn½îê·±Þìê÷wS­M\u008có·+ÎçW¹Ý=Ù×¹\u009cγ­ÜëÞs½ÛN¹²w;\u009buÍÝ]{·k^çuªnìº-³6«[+Üå;\033m»Û½ow:w¹ïo{uyîî\u00937¬\\Ƶl¶½\u009dÖVìç¯{ÎõïoSm]Ý×\u009eî\u008dæî®î®î\vÛÕïgW\036î®wqîÝ\\ïw«6½Þï\036Ýrë§=¬Fg·\\íåÔÙº÷gu·3\u009bKmÛ\027­Þ»\u0092îî\016îêwwm»\u009b­·s;MÞÁ½½­ÎóÍso^»q¯o;k\033iµ\u009bÛuyÝÞní5w:ï]ÓuÎo[«\033:åÞvEÜíÎç½ÝË­\u009eìQNöÔ\u008e\u0094vmÝȯg»e lÍ^\u008a©' 

這似乎是基於其他類似問題的編碼問題但我嘗試了.encoding = 'UTF-8'.encoding = 'ISO-8859-1',如getURL()文檔中所示,但都不起作用。 我見過類似這樣的問題的其他答案,但他們似乎都涉及編輯源文件。但是,我沒有對此文件的寫入權限。任何幫助?

+0

這怎麼可能?您寧願等待幾次從網絡上下載3GB,而不是將其存儲在本地磁盤上 - 是對的嗎?如果你不想存儲它,你打算如何訪問它? –

+0

對不起,澄清:有多個文件是每個3 GB。不想多次下載同一個文件。有沒有辦法只將數據的一個子集下載到我的硬盤?我只需要每個文件大約100 MB的3 GB數據。有沒有辦法搜索服務器上的文件,並只下載我想要的數據子集? – CephBirk

回答

1

我會使用httr這個

library("httr") 
library("ncdf4") 
url <- 'ftp://podaac-ftp.jpl.nasa.gov/allData/ghrsst/data/L4/GLOB/JPL/MUR/2015/144/20150524-JPL-L4UHfnd-GLOB-v01-fv04-MUR.nc.bz2' 
res <- GET(url, write_disk(basename(url))) 
# uncompress - I used OSX's default compression tool 
nc_open(sub("\\.bz2", "", res$request$output$path)) 

唯一的一步,我沒有理清編程是未壓縮BZ2文件,只是沒有與OSX的默認工具

+0

這種技術是否將數據寫入我的硬盤?數據文件超過3 GB,我會多次執行此操作,因此在本地保存數據不是一種選擇。 – CephBirk

+0

是的,'httr :: write_disk()'寫入磁盤而不是保存到R中的一個對象中。你可以簡單地在讀入R之後進行清理,只需'unlink(「filename」)' – sckott

0

我不t知道很多關於R,但你應該能夠在FTP模式下通過將輸出更改爲stdout而不是本地文件名,然後使用bz2解壓縮標準輸入所需的文件。

因此,例如,我可以這樣做:

curl --output - --user user:password 'ftp://127.0.0.1/somefile.bz2' | bz2 ... 

也許你可以開始從R內?或者做一個FIFO中:

mkfifo fifo 
curl .... 

,然後從R稱爲fifo文件讀取。

或許Rsystem()命令,你可以這樣做:

system('mkfifo fifo; curl ..... | bz2 .... > fifo &') 

,然後從R稱爲fifo文件讀取。

+0

這樣整理出來問題?如果是這樣,請考慮接受它作爲您的答案 - 通過點擊投票計數旁邊的空心綠色勾號/複選標記。如果沒有,請說出什麼不起作用,以便我或其他人可以進一步幫助您。謝謝。 –

相關問題