Я пытаюсь понять, как использовать пакет mmap
для доступа к большим файлам CSV. Точнее, я хотел бы
mmap
из файла csv
с помощью mmap.csv ()
; mmap.csv ()
, содержащего данные в двоичном формате; 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
?