2013-11-27 116 views
2

我最近在R中使用'rhdf5'包,並發現它非常有用,直到我試圖讀取190Mb或更大的文件。特別是,我從數據庫中抓取數據,寫入HDF5格式(成功,無論大小),然後再讀回R。當我的文件大小超過190MB,我得到以下錯誤:在R中讀取大型HDF5文件

錯誤:段錯誤由C堆棧溢出

在我而言,這相當於一個數據幀,大約有195萬行。

在閱讀軟件包文檔時,我意識到分塊數據可能會解決問題。但是,分塊似乎不適用於複合數據幀。這裏有一些示例代碼:

# save a matrix with chunking: works 
    mat = cbind(1:10, 11:20) 
    h5createFile("test.h5") 
    h5createDataset(file="test.h5", dataset="dat", dim=c(10,2), chunk=c(5,2), level=7) 
    h5write(mat, file="test.h5", name="dat") 

# convert to data frame: won't work now 
    df = as.data.frame(mat) 
    df[,2] = as.character(mat[,2]) 
    h5createFile("test2.h5") 
    h5createDataset(file="test2.h5", dataset="dat", dim=c(10,2), chunk=c(5,2), level=7) 
    h5write(df, file="test2.h5", name="dat") 
    #h5write(df, file="test2.h5", name="dat", index=list(1:10, 1:2)) 

# try to use alternate function 
    fid = H5Fcreate("test3.h5") 
    h5createDataset(file="test3.h5", dataset="dat", dim=c(10,2), chunk=c(5,2), level=7) 
    h5writeDataset.data.frame(df, fid, name="dat", level=7, DataFrameAsCompound=FALSE) 
    #h5writeDataset.data.frame(df, fid, name="dat", level=7, DataFrameAsCompound=FALSE, index=list(1:10,1:2)) 

這可能是塊沒有幫助。無論哪種方式,如果有人對將大型HDF5文件讀入R有任何建議,我將不勝感激。

+0

對於類似這樣的問題,看起來存在包裹的編碼問題,似乎包裹維護者是最好的聯繫人 - 他們會有興趣聽到和修復這一點。 'packageDescription( 'rhdf5')$ Maintainer' –

回答

0

您是否希望將它用於MODIS?我幾乎解決了同樣的問題,但後來我在GeoTIFF下載了MODIS柵格。更容易。但是如果你堅持,那麼有一個MRT - Modis Reprojection Tool-命令行工具可以將HDF轉換爲其他格式,您可以在R中打開。我認爲您提到的R中的HDF支持必須是新的,並且尚未良好調試,因爲幾個月在此之前,我做了一些研究,許多資源得出的結論是在R中沒有支持。另見MODIS in R tutorial

其他資源:

http://www.r-bloggers.com/modis-r-package-tutorial/

http://www.spatial-analyst.net/wiki/?title=Download_and_resampling_of_MODIS_images

1

一個簡單的解決方法是增加開始之前R. C堆棧大小您可以通過ulimit -s 16384做到這一點(假設ulimit -s打印8192這是典型的;你可以選擇你自己的值)。請參閱此處以瞭解更多詳情:https://stackoverflow.com/a/14719448/4323