楼主: B.N.F
7780 62

peeklong [推广有奖]

41
B.N.F 发表于 2013-9-11 22:24:17
不加quit就没事,为什么?

42
zhou.wen 发表于 2013-9-11 22:49:57
B.N.F 发表于 2013-9-11 22:21
1    data b;
2    array a(1000) $ ;
3    do i=1 to 1000;
我运行没有问题
1     data b;
2        array a(1000) $ ;
3        do i=1 to 1000;
4        a(i)=put(i,pib8.);
5        end;
6        e=addrlong(a(1));
7        call symputx("e",e);
8        _error_=dosubl( "
9        data a;
10      do i=1 to 12;
11      ans=peeklong(put(input(symget('e'),pib8.)+8*2*(i-1),pib8.),8);
12      output;
13      end;
14      run;
15      quit;
16      ");
17      run;

NOTE: 数据集 WORK.A 有 12 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.04 秒
      CPU 时间          0.00 秒


NOTE: 数据集 WORK.B 有 1 个观测和 1002 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.54 秒
      CPU 时间          0.17 秒
Practice Is The Best Teacher!

43
B.N.F 发表于 2013-9-12 00:37:59
zhou.wen 发表于 2013-9-11 22:49
我运行没有问题
1     data b;
2        array a(1000) $ ;
341  data b;
342  array a(1000) $ ;
343  do i=1 to 1000;
344  a(i)=put(i,pib8.);
345  end;
346  e=addrlong(a(1));
347  call symputx("e",e);
348  _error_=dosubl( "
349  data a;
350  do i=1 to 12;
351  ans=peeklong(put(input(symget('e'),pib8.)+8*(i-1),pib8.),8);
352  put ans=;
353  output;
354  end;
355  run;
356  quit;
357  ");
358  run;

ans=673
ans=674
ans=675
ans=676
ans=677
ans=678
ans=679
ans=680
ans=681
ans=682
ans=683
ans=684
NOTE: 数据集 WORK.A 有 12 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.03 秒
      CPU 时间          0.03 秒


NOTE: 数据集 WORK.B 有 1 个观测和 1002 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.04 秒
      CPU 时间          0.04 秒

44
zhou.wen 发表于 2013-9-12 10:37:00
B.N.F 发表于 2013-9-12 00:37
341  data b;
342  array a(1000) $ ;
343  do i=1 to 1000;
我觉得问题在于call symputx("e",e)或者symget('e')的时候,把地址e截断了,因为addrlong出来的值有些是不可显示的符号,symputx()的时候可能将有些不可显示的值截取了,另外addrlong返回的20位的文本,而symget返回的是200位的文本,这里也可能发生截断。用宏直接传递地址可能不妥,不过我也没有解决方案,希望论坛里的大牛出来解答一下

Practice Is The Best Teacher!

45
zhou.wen 发表于 2013-9-12 11:55:25
B.N.F 发表于 2013-9-12 00:37
341  data b;
342  array a(1000) $ ;
343  do i=1 to 1000;
从下面的语句可以看到,出错并不是symput,symget的问题
而是通过dosubl函数不能实现内存数据共享,dosubl的具体机制我不清楚这里就不妄加评论了
内存共享数据还是比较困难的,还是让有能力的人去实现吧
data a;
a = 123456;
e=addrlong(a);
call symput('e',e);
x=peekclong(e,8);
y=input(x,rb8.);
rc=dosubl("
data b;
b=symget('e');
x1=peekclong(b,8);
y1=input(x1,rb8.);
run;
");
b=symget('e');
x1=peekclong(b,8);
y1=input(x1,rb8.);
run;
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
ChanchanChicago + 1 + 1 + 1 鼓励积极发帖讨论
webgu + 60 + 60 + 2 + 2 + 2 讨论很激烈啊。

总评分: 经验 + 60  论坛币 + 60  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

Practice Is The Best Teacher!

46
B.N.F 发表于 2013-9-12 18:43:54
zhou.wen 发表于 2013-9-12 11:55
从下面的语句可以看到,出错并不是symput,symget的问题
而是通过dosubl函数不能实现内存数据共享,dosu ...
dosubl可以直接编译,不用symget是不是比较好?
另外peeklong和peekclong有什么区别呢?

47
邓贵大 发表于 2013-9-12 19:50:31
两位大侠拳来脚往,煞是精彩。我根本就不知道什么叫内存数据共享,但是如果楼主以前写过C,想在SAS里象C里面那样灵活地引用内存的话,基本是白费心机。为什么不把你要共享的东西放到SASFILE或者FORMAT里,享受生活呢?
Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

48
B.N.F 发表于 2013-9-12 20:14:46
邓贵大 发表于 2013-9-12 19:50
两位大侠拳来脚往,煞是精彩。我根本就不知道什么叫内存数据共享,但是如果楼主以前写过C,想在SAS里象C里面 ...
那样会不会先被读取到PDV,然后再被读取?效率会低下?
如果内存里共享的话,是不是就一直在PDV里呢?
而且我要处理array,放在dataset里,只有一行,会不会慢?

49
zhou.wen 发表于 2013-9-12 20:57:17
B.N.F 发表于 2013-9-12 20:14
那样会不会先被读取到PDV,然后再被读取?效率会低下?
如果内存里共享的话,是不是就一直在PDV里呢? ...
我建议你把数据变成一列,然后用hash组件,那样也可以实现data步共享数据
http://support.sas.com/documenta ... tn1vh9x4waiioz4.htm
Practice Is The Best Teacher!

50
B.N.F 发表于 2013-9-12 21:16:34
zhou.wen 发表于 2013-9-12 20:57
我建议你把数据变成一列,然后用hash组件,那样也可以实现data步共享数据
http://support.sas.com/docum ...
hash的速度没有temp array 快,而且列的话,没法引用处理

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-4-28 15:31