From mbonsch at posteo.de  Tue Nov 21 07:36:36 2017
From: mbonsch at posteo.de (mbonsch at posteo.de)
Date: Tue, 21 Nov 2017 07:36:36 +0100
Subject: [Rd] Truncating vectors by reference in C-backend
Message-ID: <33653f9fc65218be8f063662fdd59fec@posteo.de>

Dear all,

I want to create a function shrinkVector(x) that takes x and truncates 
it to the first element without copy.
With SETLENGTH and SET_TRUELENGTH, I can achieve that.  You can find a 
reproducible example below.
But the memory that was freed is not available for other objects 
afterwards, except if x is a list (VECSXP). Any suggestions?

library(inline)
## define the shrinking function
shrinkVector <- cfunction(signature(x = "ANY"),
                           body = paste0("SETLENGTH(x, 1);",
                                                   "SET_TRUELENGTH(x, 
1);",
                                                   
"return(R_NilValue);"))
## create a large vector that only fits into memory once
x <- 1 : 2e9
## shrink it
shrinkVector(x)
## shrinking seems to have worked
print(length(x) == 1)
# [1] TRUE
print(object.size(x))
# 48 bytes
## but I can't reuse the memory for a large x2:
x2 <- 1 : 2e8
# Error: cannot allocate vector of size 762.9 Mb
## if I remove x, it works
rm(x)
gc()
x2 <- 1 : 2e8

Thank you very much for your help.

Kind regards,
Markus Bonsch



[Rd] Truncating vectors by reference in C-backend
mbonsch at posteo.de