mmap和csv文件

Ryo*_*ogi 10 mmap r

我试图了解如何使用该包mmap 访问大型csv文件.更准确地说,我想

  1. mmapcsv文件创建一个对象mmap.csv();
  2. 保存通过mmap.csv()包含二进制格式的数据创建的文件;
  3. 能够使用该功能"将二进制数据映射回R" mmap().

实现1.和2.很简单:只需使用mmap.cv()并保存tempfile() 包含二进制数据的内容,或修改mmap.cv()为接受额外参数作为输出文件(并相应地修改行tmpstruct <- tempfile()).我遇到的麻烦是3.特别是,我需要为来自mmap对象的二进制数据中的记录构造一个C-struct .这是一个简单的可重现的例子:

# 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)
Run Code Online (Sandbox Code Playgroud)

来自的信息str()可用于构造record.struct允许cars.Rmap 通过函数mmap 映射二进制文件的C结构 .

> 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们需要两个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)
Run Code Online (Sandbox Code Playgroud)

推断正确的C-struct对于"宽"csv文件(即具有数十或数百列的文件)来说是非常不切实际的.这是我的问题: 如何record.struct直接从mmap对象构造m

Jef*_*f R 8

一个或多或少完整的例子,你要问的是 - 使用mmap和mmap.csv

data(mtcars)
tmp <- tempfile()
write.csv(mtcars, tmp)
m <- mmap.csv(tmp)   # mmap in the csv
head(m)
                    X  mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 Mazda RX4           21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2 Mazda RX4 Wag       21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3 Datsun 710          22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4 Hornet 4 Drive      21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 Hornet Sportabout   18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
6 Valiant             18.1   6  225 105 2.76 3.460 20.22  1  0    3    1


st <- m$storage.mode

## since m is already mmap'd as a binary, we'll use that here - but you'd store this
m1 <- mmap(attr(m$filedesc, "names"), mode=st, extractFUN=as.data.frame)

head(m1)
                    X  mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 Mazda RX4           21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2 Mazda RX4 Wag       21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3 Datsun 710          22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4 Hornet 4 Drive      21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 Hornet Sportabout   18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
6 Valiant             18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
Run Code Online (Sandbox Code Playgroud)

如前所述,m $ storage.mode是您需要的模式.

您可以更进一步,使用您设计的一些命名约定将模式存储在文件中.您还可以使用lenoff args 创建一个自定义二进制对象来映射mmap.

  • 回答自己:是的 - 在[您的网站]上有一些很好的文章(http://www.lemnica.com/esotericR/).你的大多数包裹(如果不是全部)都在我的名单上试用.我很高兴见到你.:) (2认同)