On 02/07/2012 04:08 PM, Hervé Pagès wrote:
Hi,

This is what I get with recent R devel on a 64-bit Ubuntu laptop:

 > mydf <- data.frame(a=1:2080, b=1001:2040, c=letters, d=LETTERS,
e=1:1040)
 > mydf_in_a_character_vector <- capture.output(mydf)
Error in print.default(m, ..., quote = quote, right = right) :
cannot allocate memory block of size 17179869182.6 Gb

The error is thrown inside src/main/printarray.c:425

                Rprintf("%*s%s", R_print.gap, "",
                        EncodeString(x[i + j * r], w[j], quote, right));

where the array w is the result of an unPROTECTed allocation earlier in the function, and a garbage collection triggered in MatrixRowLabel (in this case; allocation also occurs in MatrixColLabel, Rprintf). PROTECTion seems to have been implemented in the file assuming that the only allocations are at the head of the function; the return in the _PRINT_DEAL_c_eq_0 macro makes it difficult to balance the protection stack, and R_alloc seems to be a better solution anyway. diff attached.

Martin Morgan


I get something similar with R 2.14.1.

Cheers,
H.

 > sessionInfo()
R Under development (unstable) (2012-01-16 r58124)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base



--
Computational Biology
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109

Location: M1-B861
Telephone: 206 667-2793
Index: src/main/printarray.c
===================================================================
--- src/main/printarray.c	(revision 58290)
+++ src/main/printarray.c	(working copy)
@@ -137,7 +137,6 @@
 /* initialization; particularly of row labels, rl= dimnames(.)[[1]] and
  * rn = names(dimnames(.))[1] : */
 #define _PRINT_INIT_rl_rn				\
-    SEXP sw;						\
     int *w;						\
     int width, rlabw = -1, clabw = -1; /* -Wall */	\
     int i, j, jmin = 0, jmax = 0, lbloff = 0;		\
@@ -159,9 +158,8 @@
 
     _PRINT_INIT_rl_rn;
 
-    sw = allocVector(INTSXP, c);
     x = LOGICAL(sx) + offset;
-    w = INTEGER(sw);
+    w = (int *) R_alloc(c, sizeof(int));
     /* compute w[j] = column-width of j(+1)-th column : */
     for (j = 0; j < c; j++) {
 	formatLogical(&x[j * r], r, &w[j]);
@@ -234,9 +232,8 @@
 
     _PRINT_INIT_rl_rn;
 
-    sw = allocVector(INTSXP, c);
     x = INTEGER(sx) + offset;
-    w = INTEGER(sw);
+    w = (int *) R_alloc(c, sizeof(int));
     for (j = 0; j < c; j++) {
 	formatInteger(&x[j * r], r, &w[j]);
 	_PRINT_SET_clabw;
@@ -271,19 +268,14 @@
 static void printRealMatrix(SEXP sx, int offset, int r_pr, int r, int c,
 			    SEXP rl, SEXP cl, const char *rn, const char *cn)
 {
-    SEXP sd, se;
     double *x;
     int *d, *e;
     _PRINT_INIT_rl_rn;
 
-    PROTECT(sd = allocVector(INTSXP, c));
-    PROTECT(se = allocVector(INTSXP, c));
-    sw = allocVector(INTSXP, c);
-    UNPROTECT(2);
     x = REAL(sx) + offset;
-    d = INTEGER(sd);
-    e = INTEGER(se);
-    w = INTEGER(sw);
+    d = (int *) R_alloc(c, sizeof(int));
+    e = (int *) R_alloc(c, sizeof(int));
+    w = (int *) R_alloc(c, sizeof(int));
 
     for (j = 0; j < c; j++) {
 	formatReal(&x[j * r], r, &w[j], &d[j], &e[j], 0);
@@ -319,27 +311,18 @@
 static void printComplexMatrix(SEXP sx, int offset, int r_pr, int r, int c,
 			       SEXP rl, SEXP cl, const char *rn, const char *cn)
 {
-    SEXP sdr, ser, swr, sdi, sei, swi;
     Rcomplex *x;
     int *dr, *er, *wr, *di, *ei, *wi;
     _PRINT_INIT_rl_rn;
 
-    PROTECT(sdr = allocVector(INTSXP, c));
-    PROTECT(ser = allocVector(INTSXP, c));
-    PROTECT(swr = allocVector(INTSXP, c));
-    PROTECT(sdi = allocVector(INTSXP, c));
-    PROTECT(sei = allocVector(INTSXP, c));
-    PROTECT(swi = allocVector(INTSXP, c));
-    PROTECT(sw	= allocVector(INTSXP, c));
-    UNPROTECT(7);
     x = COMPLEX(sx) + offset;
-    dr = INTEGER(sdr);
-    er = INTEGER(ser);
-    wr = INTEGER(swr);
-    di = INTEGER(sdi);
-    ei = INTEGER(sei);
-    wi = INTEGER(swi);
-    w = INTEGER(sw);
+    dr = (int *) R_alloc(c, sizeof(int));
+    er = (int *) R_alloc(c, sizeof(int));
+    wr = (int *) R_alloc(c, sizeof(int));
+    di = (int *) R_alloc(c, sizeof(int));
+    ei = (int *) R_alloc(c, sizeof(int));
+    wi = (int *) R_alloc(c, sizeof(int));
+    w = (int *) R_alloc(c, sizeof(int));
 
     /* Determine the column widths */
 
@@ -391,9 +374,8 @@
     SEXP *x;
     _PRINT_INIT_rl_rn;
 
-    sw = allocVector(INTSXP, c);
     x = STRING_PTR(sx)+offset;
-    w = INTEGER(sw);
+    w = (int *) R_alloc(c, sizeof(int));
     for (j = 0; j < c; j++) {
 	formatString(&x[j * r], r, &w[j], quote);
 	_PRINT_SET_clabw;
@@ -437,9 +419,8 @@
     Rbyte *x;
     _PRINT_INIT_rl_rn;
 
-    sw = allocVector(INTSXP, c);
     x = RAW(sx) + offset;
-    w = INTEGER(sw);
+    w = (int *) R_alloc(c, sizeof(int));
     for (j = 0; j < c; j++) {
 	formatRaw(&x[j * r], r, &w[j]);
 	_PRINT_SET_clabw;
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to