R: выбор подмножества без копирования
Существует ли способ выбрать подмножество из объектов (фреймов данных, матриц, векторов) без копирования выбранных данных?
Я работаю с довольно большими массивами данных, но никогда не изменяю их. Однако часто для удобства я выбираю подмножества данных для работы. Создание копии большого подмножества каждый раз очень неэффективно для памяти, но как нормальное индексирование, так иsubset
(и, следовательно, xapply()
семейство функций) создают копии выбранных данных. Так что я ищу функции или структуры данных, которые могут решить эту проблему.
Некоторые возможные подходы, которые могут соответствовать моим потребностям и, надеюсь, реализованы в некоторых пакетах R:
- механизм копирования при записи , то есть структуры данных, которые копируются только при добавлении или перезаписи существующих элементов;
- неизменяемые структуры данных , которые требуют только воссоздания индексирующей информации для структуры данных, но не ее содержимого (например, создание подстроки из строки путем только создания малый объект, содержащий длину и указатель на один и тот же массив символов);
-
xapply()
аналоги, которые не создают подмножеств.
1 ответ:
Попробуйте пакет ref . В частности, его класс
refdata
.Возможно, вы упускаете из виду, что при группировке (параметр
by=
) подмножества данных не копируются, так что это быстро. [Ну технически они находятся только в общей области памяти, которая повторно используется для каждой группы и копируется с помощью memcpy, который намного быстрее, чем R для циклов в C.]
:=
indata.table
- это один из способов изменитьdata.table
на месте.data.table
отходит от обычного стиля программирования R в том, что он is not copied-on-write. Пользователь должен вызватьcopy()
явно, чтобы скопировать (потенциально очень большую) таблицу, даже внутри функции.Вы правы, что нет такого механизма, как
refdata
, встроенного вdata.table
. Я понимаю, что вы имеете в виду, и это было бы неплохо.refdata
должен работать наdata.table
, хотя, и вы могли бы быть в порядке сdata.frame
(но обязательно контролируйте копии сtracemem(DF)
).Есть также
idata.frame
(неизменяемыйdata.frame
) в пакетеplyr
, который вы можете попробовать.