【发布时间】:2011-11-04 05:59:14
【问题描述】:
我正在尝试了解如何使用包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
record.struct 允许映射二进制文件cars.Rmap
通过函数 mmap。
> 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)
对于“宽”的 csv 文件(即具有数十或数百列的文件),推断正确的 C 结构可能非常不切实际。这是我的问题:
如何直接构造record.struct
来自 mmap 对象m?
【问题讨论】:
-
我对 mmap 一无所知,但我只是想确保你知道有一个小插图:cran.r-project.org/web/packages/mmap/vignettes/mmap.pdf
-
@XuWang:谢谢,我知道这个小插曲。这就是让我通过 1 和 2 的原因。