Saving memory usage -- .C(....., DUP = FALSE) danger?

Martin Maechler Martin Maechler <>
Thu, 26 Nov 1998 14:51:37 +0100

Just found out [R 0.63, standard -v -n] :

    > rm(list=ls())
    > gc()
	     free  total
    Ncells  96538 200000
    Vcells 214008 250000
    > hist(runif(50000))
    Error: heap memory (1953 Kb) exhausted [needed 390 Kb more]

which is a bit astonishing given that I still have room for 214000 double's

    > u1 <- runif(50000)
    > u2 <- runif(50000)
    > gc()
	     free  total
    Ncells  96534 200000
    Vcells 114006 250000

debug(hist.default)  quickly revealed that the error was produced
when  .C("bincount",....) was called.

Looking at the help, 
and then at the "DUP = TRUE" default argument to .C(.),
I was reminded that every argument is first copied before being passed to

Setting the "DUP = FALSE" argument in hist.default
made it work with the above 50000 doubles.

But then I wondered ``more generally'' :

	What exactly happens / can happen when calling, e.g.,

		r <- .C("foo", x=x, y=as.double(y),  DUP = FALSE)

	Will 'x' be altered after the call to .C(*)  if in C's 
		foo(double *x, double *y)
	x is altered?
	Will 'y' be unaltered anyway, since   "as.double(y)" produces a
	a different object than 'y' anway?

I know that I could make experiments and find out,
but hopefully, one of you will know much better and explain to all

Really useful might be a comprehensive list of recommendations 
on when  "DUP = FALSE" is useful / advisable / detestable ...

Thank you!


Martin Maechler <>
Seminar fuer Statistik, ETH-Zentrum SOL G1;	Sonneggstr.33
ETH (Federal Inst. Technology)	8092 Zurich	SWITZERLAND
phone: x-41-1-632-3408		fax: ...-1086			<><

r-devel mailing list -- Read
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: