我正在尝试理解如何使用 mmap
包访问大型 csv 文件。更具体地说,我想要:
- 使用
mmap.csv()
从csv
文件创建一个mmap
对象; - 将由
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-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
?