BookmarkSubscribeRSS Feed
Vivian
Calcite | Level 5

Hi, all:

I have been a IML user for years.

However, I recently encountered a very weird problem when using IML on the linux system.

Basically I wrote a sas program for a new estimation method created with macros and IML, and then did some simulations on linux system.

The SAS IML was failed with the error message as follows:

ERROR: (execution) Unable to allocate sufficient memory. At least 3115064 more bytes required.

operation : CHOOSE at line 578 column 167

operands  : _TEM1001, *LIT1083, dwn

_TEM1001    624 rows    624 cols    (numeric)

*LIT1083      1 row       1 col     (numeric)

         0

dwn    624 rows    624 cols    (numeric)

For the above message, the corresponding codes in my program is "dwn=choose(wn=.,0,wn);" where wn is a 624*624 matrix.

Well, the point is that I did the same simulations (same codes on same server, I promise) last Nov, but everything was fine without memory problem.

Here is the information about the sas version and the linux system I used.

Last Nov. :

NOTE: SAS (r) Proprietary Software 9.3 (TS1M0)

NOTE: This session is executing on the Linux 2.6.18-238.9.1.el5 (LIN X64) platform.

Recently:

NOTE: SAS (r) Proprietary Software 9.3 (TS1M0)

NOTE: This session is executing on the Linux 2.6.18-274.7.1.el5 (LIN X64) platform.

Does the 'out of memory' issue really result from the system difference?

Any clue?

I have been struggling with this problem for a while.

I would appreciate anyone who can help out.

Thanks,

Vivian

3 REPLIES 3
Rick_SAS
SAS Super FREQ

Strange. SAS didn't change, but you are getting different behavior. I have no idea what has changed on your system,

but remember that memory is shared among all applications. If you have a big PDF file open, an email program running, or other applications, those are all using memory, too.

However, maybe I can solve the immediate problem of getting your program to run. Instead of

   dwn=choose(wn=.,0,wn);

try this:

   dwn = wn;  /* copy wn */

   idx = loc(dwn=.); /* find missing */

   if ncol(idx)>0 then dwn[idx]=0; /* replace with zeros */

The above code can be even more memory-efficient if you are willing to overwrite the original copy of wn:

   idx = loc(wn=.);

   if ncol(idx)>0 then wn[idx]=0; /* overwrite wn */

Of course, this might just move the out-of-memory error to another line of the program.

Vivian
Calcite | Level 5

Thanks a lot for your prompt reply.

As I have used SAS for many years, it is also my first time to have such problem.

I also have no idea what has been chenged in our system.

The staff at our school computer center in fact could not figure out what happened.

Regarding the out-of-memory problem, I did ever edited the codes and unfortunately, like you exppected, it moved the error to another line of the problem.

I even tried to release some memory and still, it didn't work.

That is why I have been struggling for such a log time.

Another interesting thing is that I submitted the same SAS program on a computer with window 7.

Everything works well without memory problem, even with the function CHOOSE.

So, no solution, right?

Anyway, I still appreciate your response.

Oh, by the way, as I have read through your book and started using IML Studio for a while, I have a question in mind.

Can IML Studio work together with some macro codes, like we ususally do in regular IML (PROC IML)?

Thank you very much!!

Vivian

Rick_SAS
SAS Super FREQ

You can contact technical support to see if they have any advice on the out-of-memory situation.

Regarding macros, SAS/IML Studio programs are not parsed by the macro facility, so it doesn't support macros in the usual way. However, you can

1) call macros within a SUBMIT/ENDSUBMIT block. These are executed in the SAS environment.

2) Use the SYMGET and SYMPUT family of functions to get or set macro variables from within a SAS/IML Studio program. For example, the following statements set a macro variable (The '@' operator is shorthand for 'submit this single SAS statement.'), then reads in the macro and assigns it to an IML variable:

@%let g=5; /* submit global stmt */

five = symgetn("g");

print five;

See p. 99 of my book for more examples.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.

From The DO Loop
Want more? Visit our blog for more articles like these.
Discussion stats
  • 3 replies
  • 1996 views
  • 0 likes
  • 2 in conversation