Я пытаюсь понять, как использовать пакет mmap
для доступа к большим файлам csv. Точнее, я хотел бы
- Создайте объект
mmap
из файлаcsv
с помощьюmmap.csv()
; - Сохраните файл, созданный
mmap.csv()
, содержащий данные в двоичном формате; - Уметь "сопоставить двоичные данные с R" с помощью функции
mmap()
.
Достижение 1. и 2. легко: просто используйте mmap.cv()
и сохраните tempfile()
который содержит двоичные данные, или изменить mmap.cv()
, чтобы принять дополнительный параметр
в качестве выходного файла (и соответственно изменить строку tmpstruct <- tempfile()
).
У меня возникают проблемы с 3. В частности, мне нужно построить
C-struct для записей в двоичных данных из объекта 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
?