[Question corrigée des réponses suivantes]Ecriture de grandes matrices dans une fonction - rapide vs lent
Merci pour les réponses. Je n'étais pas clair dans ma question, pour laquelle je m'excuse.
Je vais essayer de donner plus de détails sur notre situation. Nous avons c. 100 matrices que nous gardons dans un environnement. Chacun est très grand. Si possible, nous voulons éviter toute copie de ces matrices lorsque nous effectuons des mises à jour. Nous sommes souvent confrontés à la limite de mémoire de 2 Go, ce qui est très important pour nous.
Ainsi, nos deux exigences sont 1) éviter les copies et 2) adresser indirectement les matrices par leur nom. La vitesse, bien qu'importante, est un problème secondaire qui serait résolu en évitant la copie.
Il me semble que la solution de Tommy impliquait la création d'une copie (bien qu'elle ait entièrement répondu à ma question initiale, je suis donc fautive).
Le code ci-dessous est ce qui nous semble le plus évident, mais il crée clairement une copie (comme le montre l'augmentation de memory.size)
myenv <- new.env()
myenv$testmat1 <- matrix(1.0, nrow=6000, ncol=200)
testfnDirect <- function(paramEnv) {
print(memory.size())
for (i in 1:300) {
temp <- paramEnv$testmat1[10,]
paramEnv$testmat1[10,] <- temp * 0
}
print(memory.size())
}
system.time(testfnDirect(myenv))
En utilisant le mot-clé avec semble éviter cela, comme ci-dessous:
myenv <- new.env()
myenv$testmat1 <- matrix(1.0, nrow=6000, ncol=200)
testfnDirect <- function(paramEnv) {
print(gc())
varname <- "testmat1" # unused, but see text
with (paramEnv, {
for (i in 1:300) {
temp <- testmat1[10,]
testmat1[10,] <- temp * 0
}
})
print(gc())
}
system.time(testfnDirect(myenv))
Toutefois, ce code fonctionne en adressant directement testmat1 par son nom. Notre problème est que nous devons nous y attaquer indirectement (nous ne savons pas à l'avance quelles matrices nous mettrons à jour).
Est-il possible de modifier testfnDirect telle que nous utilisons la variable nom_variable plutôt que hardcoding testmat
FWIW: Cet exemple peut convenir, mais en général, il est bon d'éviter de produire des exemples où la mise en cache ou la mémoisation peuvent créer des accélérations évidentes. Dans de tels cas, il est difficile de faire la distinction entre les optimisations qui sont sous notre contrôle et celles qui sont effectuées par l'interpréteur ou le matériel. – Iterator