我是哈希表查找的大力支持者 - 他们帮助我在几分钟内完成了一些大规模的数亿行连接,否则可能需要几个小时。
你这样做的方式并不是一条坏路。如果您发现内存不足,首先要确定哈希表实际使用了多少内存。sasnrd 的这篇文章准确地展示了如何做到这一点 https://sasnrd.com/sas-hash-object-memory-size/.
一旦您确定了它的使用量并有了基准,或者如果它因为内存不足而根本无法运行,您可以尝试一些选项,看看它们如何改善您的内存使用和性能。
1. 仅包含您需要的密钥和数据
加载哈希表时,排除任何不必要的变量。您可以在加载哈希表之前或期间执行此操作。您可以使用数据集选项来帮助减小表大小,例如where
, keep
, and drop
.
dcl hash h1(dataset: 'mydata(keep=key var1)');
2. 减少变量长度
长字符变量占用更多内存。将长度减少到所需的最小值将有助于减少内存使用量。使用%squeeze()
宏在加载之前自动将所有变量减少到所需的最小大小。你可以找到那个宏here https://support.sas.com/kb/24/804.html.
%squeeze(mydata, mydata_smaller)
;
3.调整hashexp选项
hashexp
有助于提高性能并减少哈希冲突 https://stackoverflow.com/questions/11359103/what-exactly-is-table-size-in-sas-hashtable-specified-by-hashexp。较大的值hashexp
会增加内存使用量,但可能会提高性能。较小的值将减少内存使用量。我建议阅读上面的链接,并查看 sasnrd 这篇文章顶部的链接,以了解它将如何影响您的加入。该值的大小应根据表的大小进行适当调整。对于您应该使用什么值,没有硬性且快速的答案,我的建议是您的系统可以处理的值。
dcl hash h1(dataset: 'mydata', hashexp:2)
;
4. 为 SAS 会话分配更多内存
如果你的哈希表经常出现内存不足的情况,那么你的哈希表的内存可能太低了。memsize
。如今,许多机器都拥有充足的 RAM,即使在装备中等的机器上,SAS 也能很好地处理多个高强度 SAS 会话。增加此值可能会产生巨大的差异,但您希望调整此值作为最后的手段。
默认memsize
选项是2GB。尝试将其增加到 4GB、8GB、16GB 等,但不要过度,例如将其设置为 0 以使用所需的内存。您不希望您的 SAS 会话耗尽all计算机上的内存(如果其他用户也在该计算机上)。
暂时将其设置为 0 可能是一个有用的故障排除工具,可以查看哈希对象在未运行时实际占用的内存量。但如果这是您自己的机器,并且您是唯一使用它的人,您可以直接将其设置为 0。
memsize
可以在 SAS 调用时或在SAS 配置文件 https://communities.sas.com/t5/SAS-Procedures/Locating-SAS-Configuration-Files/td-p/207309直接(9.4 上的 sasv9.cfg 或 Viya 中的 SASV9_Option 环境变量)。