我想了解如何使用包mmap
訪問大型csv文件。更確切地說,我想mmap和csv文件
- 創建從
csv
文件mmap
物體mmap.csv()
; - 保存由
mmap.csv()
創建的包含二進制格式數據的文件; - 使用函數
mmap()
可以「將二進制數據映射回R」。
實現1.和2是容易的:只要使用mmap.cv()
並保存tempfile()
包含二進制數據或修改mmap.cv()
接受作爲輸出文件的額外參數 (和修改線tmpstruct <- tempfile()
相應)。 我遇到的問題是3.特別是,我需要爲來自mmap
對象的二進制數據中的記錄構造一個 C結構。 下面是一個簡單再現的例子:
# create mmap object with its file
library(mmap)
data(cars)
m <- as.mmap(cars, file="cars.Rmap")
colnames(m) <- colnames(cars)
str(m)
munmap(m)
從str()
的信息可以被用於構建C-結構 record.struct
,其允許通過功能MMAP映射二進制文件cars.Rmap
。
> str(m)
<mmap:temp.Rmap> (struct) struct [1:50, 1:2] 4 ...
data :<externalptr>
bytes : num 400
filedesc : Named int 27
- attr(*, "names")= chr "temp.Rmap"
storage.mode :List of 2
$ speed:Classes 'Ctype', 'int' atomic (0)
.. ..- attr(*, "bytes")= int 4
.. ..- attr(*, "signed")= int 1
$ dist :Classes 'Ctype', 'int' atomic (0)
.. ..- attr(*, "bytes")= int 4
.. ..- attr(*, "signed")= int 1
- attr(*, "bytes")= int 8
- attr(*, "offset")= int [1:2] 0 4
- attr(*, "signed")= logi NA
- attr(*, "class")= chr [1:2] "Ctype" "struct"
pagesize : num 4096
dim :NULL
在這種情況下,我們需要兩個4字節的整數:
# load from disk
record.struct <- struct(speed = integer(), # int32(), 4 byte int
dist = integer() # int32(), 4 byte int
)
m <- mmap("temp.Rmap", mode=record.struct)
推斷正確的C-結構可以爲「寬」的CSV文件非常不切實際的(即具有數十或數百文件列)。這裏是我的問題: 如何從mmap對象m
直接構造record.struct
?
我對mmap一無所知,但我只是想確保你知道有一個小插曲:http://cran.r-project.org/web/packages/mmap/vignettes/mmap.pdf –
@徐旺:謝謝,我知道這個小插曲。這是讓我通過1和2。 – Ryogi