【发布时间】:2012-10-30 04:34:43
【问题描述】:
假设我在名为links 的数据集中表示了一个有向 图,它有两个变量:from_id 和to_id。我想使用 SAS Data Step 做两件事:(1)计算节点数,(2)计算边数。
假设links数据集如下所示。
from_id to_id
----------------
1 2
2 3
3 1
3 2
在这个例子中,有 3 个节点和 4 条边。 (我们可以假设links 中没有重复边)。节点是 1、2 和 3。边是 1->2、2->3、3->1 和 3->2。
下面是一个 SAS 宏,它使用 SAS Data Step 和 proc sql 来计算节点和边。它工作得很好,但我希望使用 SAS Data Step 以便(可能)更快地计算节点和边。
/* display number of nodes and edges for graph */
%macro graph_info(links);
data nodes;
set &links;
node_id = from_id;
output;
node_id = to_id;
output;
keep node_id;
run;
proc sql noprint;
select count(distinct node_id) into :numNodes from nodes;
quit;
proc datasets lib=work nolist;
delete nodes;
quit;
proc sql noprint;
select count(*) into :numEdges from &links;
quit;
%put Nodes: &numNodes;
%put Edges: &numEdges;
%mend;
【问题讨论】:
-
您可能拥有多少个节点?它们都适合记忆吗?
-
多达几亿个节点/边。数据集很容易达到 10 GB 左右。虽然我可以访问内存更大的机器,但我的桌面客户端有 8 GB 内存。
-
如果它不适合内存,您显然可以使用单个 proc 排序和单个数据步骤来完成。