Читать C ++ бинарный файл в R - PullRequest
0 голосов
/ 21 декабря 2018

Могу ли я прочитать двоичный файл, написанный C ++ на R?

Я использовал Rcpp в своем пакете R, и симуляции обычно генерируют большой объем данных.Я планирую записать вывод в двоичные файлы в C ++, а затем прочитать их обратно в R. Это работает, если я пишу в виде текстовых файлов, но я не нашел решения с двоичными файлами.Иногда программа резко падает, если я передаю данные с использованием множества NumericVectors (мне еще предстоит полностью понять управление памятью с помощью Rcpp).

Может ли этот подход позволить мне обмениваться большими наборами данных между C ++ и R по сравнению с тем, что возможно?передавая векторы?В C ++ максимальный размер вектора ограничен оперативной памятью и адресной шиной (может быть?), Но я думаю, что R способен загружать большие векторы, используя swap.Я правильно понимаю или неправильно понимаю концепции?

1 Ответ

0 голосов
/ 21 декабря 2018

Да, вы можете.Но это "сложно".

Вы вступаете в тему, называемую двоичной сериализацией.Есть много работы там.По сути, вы находитесь где-то в континууме между

  • минимальным: откройте файл, запишите N двоичных элементов;затем с другой стороны прочитайте N двоичных файлов.Мы делали нечто подобное на работе несколько лет назад, когда записали некоторые метаданные с <rows,cols,version>, а затем двоичный двоичный объект rows * cols double, чтобы прикрепить к матрице

  • maximal: использовать полностью описательную метаданныеязык, такой как Protocol Buffer или MessagePack, чтобы описать двоичный контент, написать его на C ++ (используя соответствующую библиотеку) и прочитать обратно в R (используя соответствующие пакеты - я связан с каждым из них: RProtoBuf и RcppMsgPack).

И многое другое.Если вам действительно нужно только обмениваться данными между C (++) и R, вы можете попробовать формат RData / rds.Есть одна библиотека: librdata , и я экспериментировал с ней (и подал несколько отчетов об ошибках и сделал несколько запросов на извлечение).Я мог бы начать там.

Короче говоря: проведите некоторое исследование, выясните, что делать, а затем сделайте это:)

PS Если вы вызываете C ++ через Rcpp из R, тогда вам могут не понадобиться файлы.Мы можем передавать большие объекты туда и обратно - ограничение может быть вашей оперативной памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...