Файлы mmap и csv

Я пытаюсь понять, как использовать пакет mmap для доступа к большим файлам CSV. Точнее, я хотел бы

  1. создать объект mmap из файла csv с помощью mmap.csv () ;
  2. Сохранить файл создается с помощью mmap.csv () , содержащего данные в двоичном формате;
  3. Уметь «отображать двоичные данные обратно в R» с помощью функции mmap () .

Достичь 1. и 2. легко: просто используйте mmap.cv () и сохраните tempfile () , содержащий двоичные данные, или измените mmap.cv () , чтобы принять дополнительный параметр в качестве выходного файла (и соответственно изменить строку tmpstruct <- tempfile () ). Что У меня проблема с числом 3. В частности, мне нужно создать C-структуру для записей в двоичных данных из объекта mmap . Вот простой воспроизводимый пример:

# 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 который позволяет отображать двоичный файл 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)

Выбор правильной C-структуры может быть очень непрактичным для «широких» файлов csv (то есть файлов с десятками или сотнями столбцов). Вот мой вопрос: Как можно построить record.struct напрямую из объекта mmap m ?

10
задан Ryogi 4 November 2011 в 07:09
поделиться