Неожиданное поведение при копировании памяти в Windows - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь лучше понять управление памятью R и идею «копировать при модификации». С веб-сайта Advance R Хедли Уикхэма (https://adv -r.hadley.nz / names-values.html ) кажется, что, как только векторный объект был скопирован для модификации, дальнейшие модификации не должны требовать копия:

# From Hadley's website, not my computer    
x <- c(1, 2, 3)
cat(tracemem(x), "\n")
#> <0x7f80c0e0ffc8>

y <- x
y[[3]] <- 4L
#> tracemem[0x7f80c0e0ffc8 -> 0x7f80c4427f40]:

y[[3]] <- 5L
# No copy

Однако, когда я действительно запускаю это на своем компьютере с Windows, я вижу вторую копию из tracemem:

# Run on my windows desktop
x <- c(1, 2, 3)
cat(tracemem(x), "\n")
#> <000002089596EBB8> 
y <- x
y[[3]] <- 4L
#> tracemem[0x000002089596ebb8 -> 0x00000208960323d0]: 
y[[3]] <- 5L
#> tracemem[0x00000208960323d0 -> 0x00000208961ba540]:

Далее, узнав об идее об объекте NAM ( Действительно ли данные копируются четыре раза в функции замены R? ), я обнаружил, что даже недавно созданные векторы в новом сеансе R являются NAM (3 ), хотя я и ожидал NAM (1)

x <- c(1, 2, 3)
.Internal(inspect(x))
# 0x0000022abc9e4998 14 REALSXP g0c3 [NAM(3)] (len=3, tl=0) 1,2,3

Кто-нибудь еще испытывает это? Моя сессияInfo ниже.

R версия 3.5.3 (2019-03-11) Платформа: x86_64-w64-mingw32 / x64 (64-разрядная версия) Работает под: Windows 10 x64 (сборка 16299)

Матричные продукты: по умолчанию

языковой стандарт: [1] LC_COLLATE = English_United States.1252 LC_CTYPE = English_United States.1252 LC_MONETARY = English_United States.1252 [4] LC_NUMERIC = C
LC_TIME = English_United States.1252

прикрепленные базовые пакеты: [1] stats graphics grDevices utils
база методов наборов данных

загружено через пространство имен (и не подключено): [1] compiler_3.5.3 tools_3.5.3

Кроме того, у меня есть доступ к машине Linux с R 3.5.1. На этой машине я не получаю вторую копию памяти, но все еще вижу, что новые векторы - это NAM (3).

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