8的倍数-SAS字符变量的最佳长度?

8的倍数-SAS字符变量的最佳长度?,sas,Sas,我听说SAS以8字节的块存储字符变量 因此,我们的想法是,我们应该始终将字符变量的长度指定为8的倍数 我已经搜索过了,但找不到对最初断言的任何支持 这是真的吗?文档中是否包含了这一点?对于不包含8字节数值变量的数据集,这一点是正确的。我将分别发布这样做的数据集 不,8字节字符变量长度没有什么特别之处 见下文: data length8; length char0001-char9999 $8; call missing(of _all_); do _i = 1 to 100;

我听说SAS以8字节的块存储字符变量

因此,我们的想法是,我们应该始终将字符变量的长度指定为8的倍数

我已经搜索过了,但找不到对最初断言的任何支持


这是真的吗?文档中是否包含了这一点?

对于不包含8字节数值变量的数据集,这一点是正确的。我将分别发布这样做的数据集


不,8字节字符变量长度没有什么特别之处

见下文:

data length8;
  length char0001-char9999 $8;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
data length7;
  length char0001-char9999 $7;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length4;
  length char0001-char9999 $4;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length12;
  length char0001-char9999 $12;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length16;
  length char0001-char9999 $16;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length17;
  length char0001-char9999 $17;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
每个数据集的大小不同,大致与字符变量的长度成比例。请注意,4的大小是一个更大的比例(在我的机器上,无论如何):事实上,4,5,6都是相同的大小。这是因为页面大小:我安装的最小页面大小是64kb(65535字节),其中4、5、6都只能容纳一行数据(大约40、50和60kb行)。这不是因为为字符变量保存了任何特定的大小,而是因为数据记录的总长度


在这一点上,您可以通过少量更改来节省开支:如果您的数据的排列方式恰好使页面大小略小于行大小的两倍,那么将行稍微缩小将节省一半的空间。这不太可能发生,除非是在极少数情况下——它需要非常宽的行(许多变量,或非常长的字符变量)。不过,您也可以使用选项来改变页面大小,这可能是处理此类边缘情况的更好方法。

对于不包含8字节数字变量的数据集,这是正确的。我将分别发布这样做的数据集


不,8字节字符变量长度没有什么特别之处

见下文:

data length8;
  length char0001-char9999 $8;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
data length7;
  length char0001-char9999 $7;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length4;
  length char0001-char9999 $4;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length12;
  length char0001-char9999 $12;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length16;
  length char0001-char9999 $16;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length17;
  length char0001-char9999 $17;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
每个数据集的大小不同,大致与字符变量的长度成比例。请注意,4的大小是一个更大的比例(在我的机器上,无论如何):事实上,4,5,6都是相同的大小。这是因为页面大小:我安装的最小页面大小是64kb(65535字节),其中4、5、6都只能容纳一行数据(大约40、50和60kb行)。这不是因为为字符变量保存了任何特定的大小,而是因为数据记录的总长度


在这一点上,您可以通过少量更改来节省开支:如果您的数据的排列方式恰好使页面大小略小于行大小的两倍,那么将行稍微缩小将节省一半的空间。这不太可能发生,除非是在极少数情况下——它需要非常宽的行(许多变量,或非常长的字符变量)。不过,您也可以使用选项来改变页面大小,这可能是处理此类边缘情况的更好方法。

对于不包含8字节数字变量的数据集,这是正确的。我将分别发布这样做的数据集


不,8字节字符变量长度没有什么特别之处

见下文:

data length8;
  length char0001-char9999 $8;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
data length7;
  length char0001-char9999 $7;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length4;
  length char0001-char9999 $4;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length12;
  length char0001-char9999 $12;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length16;
  length char0001-char9999 $16;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length17;
  length char0001-char9999 $17;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
每个数据集的大小不同,大致与字符变量的长度成比例。请注意,4的大小是一个更大的比例(在我的机器上,无论如何):事实上,4,5,6都是相同的大小。这是因为页面大小:我安装的最小页面大小是64kb(65535字节),其中4、5、6都只能容纳一行数据(大约40、50和60kb行)。这不是因为为字符变量保存了任何特定的大小,而是因为数据记录的总长度


在这一点上,您可以通过少量更改来节省开支:如果您的数据的排列方式恰好使页面大小略小于行大小的两倍,那么将行稍微缩小将节省一半的空间。这不太可能发生,除非是在极少数情况下——它需要非常宽的行(许多变量,或非常长的字符变量)。不过,您也可以使用选项来改变页面大小,这可能是处理此类边缘情况的更好方法。

对于不包含8字节数字变量的数据集,这是正确的。我将分别发布这样做的数据集


不,8字节字符变量长度没有什么特别之处

见下文:

data length8;
  length char0001-char9999 $8;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
data length7;
  length char0001-char9999 $7;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length4;
  length char0001-char9999 $4;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length12;
  length char0001-char9999 $12;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length16;
  length char0001-char9999 $16;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;

data length17;
  length char0001-char9999 $17;
  call missing(of _all_);
  do _i = 1 to 100; 
    output;
  end;
  drop _i;
run;
每个数据集的大小不同,大致与字符变量的长度成比例。请注意,4的大小是一个更大的比例(在我的机器上,无论如何):事实上,4,5,6都是相同的大小。这是因为页面大小:我安装的最小页面大小是64kb(65535字节),其中4、5、6都只能容纳一行数据(大约40、50和60kb行)。这不是因为为字符变量保存了任何特定的大小,而是因为数据记录的总长度


在这一点上,您可以通过少量更改来节省开支:如果您的数据的排列方式恰好使页面大小略小于行大小的两倍,那么将行稍微缩小将节省一半的空间。这不太可能发生,除非是在极少数情况下——它需要非常宽的行(许多变量,或非常长的字符变量)。不过,您也可以使用选项更改页面大小,这可能是处理此类边缘情况的更好方法。

正如Joe所说,我使用以下脚本进行了经验测试:

libname testlen "<directory>";

%macro create_ds(length=, dsName=);
    data &dsName;
        length x $&length.;
        do i=1 to 1000000;
            x="";
            output;
        end;
    run;
%mend;

%macro create_all_ds;
    %do i=1 %to 20;
        %create_ds(length=&i, dsName=testlen.len&i)
    %end;
%mend;

%create_all_ds
结果如下:

数据集1-4占用约15.8 MB

数据集5-8占用约23.7 MB

这可能意味着对于有效的长度声明,字符变量长度的总和应该是8的倍数

正如乔所说,我