SAS 哈希表:有没有办法在不同的键上查找/连接或具有可选键

2024-01-19

我经常处理一些键不完美的数据,并且我需要连接来自不同源的数据,我想继续使用哈希对象以获得速度优势,但是当我使用大量数据时,我可能会遇到崩溃(记忆限制)。

一个简单的概述是我有 2 个不同的键,它们都是唯一的,但并非每条记录都存在,我们将它们称为 Key1 和 Key2。

我当前的解决方案不是很优雅(但它有效)是执行以下操作:

if _N_ = 1 then do;
   declare hash h1(Dataset:"DataSet1");
                h1.DefineKey("key1");
                h1.DefineData("Value");
                h1.DefineDone();
   declare hash h2(Dataset:"DataSet1");
                h2.DefineKey("key2");
                h2.DefineData("Value");
                h2.DefineDone();
end;

set DataSet2;

rc = h1.find();
if rc NE 0 then do;
    rc = h2.find();
end;

所以我在两个哈希表中有完全相同的数据集,但定义了两个不同的键,如果找不到第一个键,那么我尝试找到第二个键。

有谁知道一种方法可以使其更高效/更易于阅读/更少的内存密集型?

如果这看起来是完成任务的不好方法,我深表歉意,我绝对欢迎批评,以便我可以学习!

提前致谢,

Adam.


我是哈希表查找的大力支持者 - 他们帮助我在几分钟内完成了一些大规模的数亿行连接,否则可能需要几个小时。

你这样做的方式并不是一条坏路。如果您发现内存不足,首先要确定哈希表实际使用了多少内存。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 环境变量)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SAS 哈希表:有没有办法在不同的键上查找/连接或具有可选键 的相关文章

  • 如何在perl中不使用key来查找值是否存在于hash中?

    我有一个像这样的哈希图 my name AUS dynamic values my hash a gt x gt 1 gt US 2 gt UK y gt 1 gt AFRICA 2 gt AUS b gt
  • SAS列出并存储指定库下的所有表名到表中

    在库 测试 下 我有 5 个数据集 如何列出所有表名称 proc datasets lib work quit run 虽然我想进一步利用这些信息 就像表名一样 Thanks 使用 SQLdictionary tables view pro
  • Powershell:使用哈希表替换字符串

    好的 我已经设置了一个哈希表 其中名称是要替换的内容 键是要替换的内容 如下所示 r dog canine cat feline eric eric cartman 接下来我应该做什么 我试过这个 Get Content C scripts
  • 碰撞解决:二次探测与单独链接

    好的 我一直在对哈希表和不同的冲突解决问题进行一些实验 我试图找出哪个更有效地进行查找 即使用单独的链接或二次探测来解决冲突的哈希表 我的结果表明 即使对于较小的负载因子 例如 0 4 或 0 2 单独链接也比二次探测更快 是这种情况还是我
  • 哈希表。命名历史。为什么不用哈希表呢?

    we know ArrayList LinkedList TreeMap 以及其他 以及所有名称均采用 CamelCase 格式 但为什么Hashtable not HashTable 这是一个无原则的问题 只是想知道 Hashtable是
  • 哈希表真的可以是 O(1) 吗?

    哈希表可以实现 O 1 似乎是常识 但这对我来说从来没有意义 有人可以解释一下吗 我想到了以下两种情况 A 该值是一个小于哈希表大小的 int 因此 该值是它自己的哈希值 因此不存在哈希表 但即使有 也会是 O 1 并且效率仍然很低 B 您
  • 哈希表 v 自平衡搜索树

    我很想知道使用自平衡树技术来存储项目比使用哈希表更重要的推理是什么 我发现哈希表无法维护插入顺序 但我始终可以在顶部使用链表来存储插入顺序序列 我发现对于少量的值 哈希函数会增加成本 但我总是可以将哈希函数与密钥一起保存以加快查找速度 我知
  • sas7bdat 变量名称中带有空格

    我收到了几个扩展名为 sas7bdat 的 SAS 数据集文件 我在 Windows 上使用 SAS 9 3 这些文件的创建者显然使用了不同的环境和 或软件 许多文件的 var 名称包含空格和其他无效字符 甚至运行一个proc conten
  • SAS 宏日期问题

    我对 SAS 完全陌生 我的数据库包含 2000 2011 年的数据 我的数据集列表对于每个数据集都是这样的date TP 2004012 for 26JAN2004 TP 20040127 for 27JAN2004 TP 2004012
  • SAS:如何计算除某些字符变量之外的所有字符变量的频率

    我知道我可以使用类似以下内容来计算所有字符的频率 proc freq data sashelp class tables char run 但是 有没有办法排除一些变量呢 我想做类似的事情 proc freq data sashelp cl
  • 从哈希表中删除一个值的成本是多少?

    现在我有一个问题 当我们在插入过程中使用线性探测时 有人问我从哈希表中删除值的成本 通过阅读互联网上的各种内容 我发现它必须与负载因子有关 虽然我不确定 但我读到了负载因数与所需探头数量之间的关系 探头数量 1 1 LF 所以我相信成本必须
  • ANSI C 哈希表实现,数据位于一个内存块中

    我正在寻找一种哈希表的开源 C 实现 它将所有数据保存在一个内存块中 因此可以轻松地通过网络发送数据 我只能找到为添加到其中的每个键值对分配小块内存的内存 预先非常感谢您的所有投入 编辑 它不一定需要是哈希表 无论键值对表可能会做什么 序列
  • 使用 SAS EG 通过代理从 API 下载 JSON 文件

    我正在尝试使用瑞士当局提供的 API 对公司网络内的地址进行地理编码 我的公司使用带有用户名和密码的代理服务器 我是 SAS EG 的新手 这是我迄今为止拥有的代码 我必须匿名一些内容才能被允许在此处发布 filename response
  • 如何在 C# 中使用 foreach 枚举哈希表

    我试图列举一个Hashtable其定义为 private Hashtable keyPairs new Hashtable foreach SectionPair s in keyPairs if s Section incomingSec
  • Java 中的 ConcurrentHashMap 和 Hashtable [重复]

    这个问题在这里已经有答案了 Java 中的 ConcurrentHashMap 和 Hashtable 有什么区别 哪个对于线程应用程序更有效 ConcurrentHashMap 和 Hashtable 锁定机制 Hashtable属于Co
  • 什么时候使用哈希表?

    什么情况下使用哈希表可以提高性能 什么情况下不能 哪些情况不适合使用哈希表 什么情况下使用哈希表可以提高性能 什么情况下不能 如果您有理由关心 请使用哈希表和您正在考虑的其他任何内容来实现 将您的实际数据放入其中 并衡量哪个性能更好 也就是
  • 对 Python 中的嵌套字典进行排序

    我有以下字典 var a Black grams 1906 price 2 05 Blue grams 9526 price 22 88 Gold grams 194 price 8 24 Magenta grams 6035 price
  • 在新实例中打开 SAS 程序

    我正在尝试找出一种在单击时默认在增强编辑器的新实例中打开 SAS 程序的方法 问题是asked https stackoverflow com questions 4654876 open sas program in new window
  • SQL - 每个级别都有记录的递归树层次结构

    尝试使用 SAS 据我所知 不支持WITH RECURSIVE 在 SQL 中创建经典的层次结构树 这是现有表中的简化数据结构 USER ID SUPERVISOR ID 因此 要构建层次结构 您只需递归连接 x 次即可获取您要查找的数据
  • 为什么 Hashtable 不允许空键或空值?

    正如 JDK 文档中所指定的 Hashtable 不允许空键或空值 HashMap 允许一个空键和任意数量的空值 为什么是这样 Hashtable 是较旧的类 通常不鼓励使用它 也许他们看到了对 null 键的需要 更重要的是 null 值

随机推荐

  • Springdoc Swagger UI 不使用 swagger-config

    需要一些有关 springdoc openapi ui 的帮助 我正在使用 springdoc openapi ui 来呈现我的 API 模式 这是它的版本详细信息 Now i have done some configuration in
  • 绝对定位的弹性项目不会从 IE11 中的正常流程中删除

    我们有两个包含内容的 div 第三个 div 是具有绝对位置的背景 容器是一个弹性盒子 All works fine in Chrome and Safari but Firefox and IE11 factors in the abso
  • UIApplication.sharedApplication().setStatusBarStyle() 在 iOS 9 中已弃用

    我一直在使用 UIApplication sharedApplication setStatusBarStyle 在我的 appDelegate 中 它工作得很好 但从 iOS 9 开始 这个方法已被弃用 我找不到替代方法 我想将整个应用程
  • 让div出现并将整个html更改为更暗

    我有一个 div 单击按钮后 我希望 div 出现 我可以做到 但我希望整个背景也变得更暗 这与叠加层内联 我尝试过使用不透明度 我使用 jQuery 更改整个 html 的不透明度 即 html css opacity 0 5 并将 di
  • Bootstrap 示例中未显示数据表按钮

    知道为什么在使用此代码进行引导时按钮 csv excel pdf 打印等 不显示吗 https datatables net extensions buttons examples styling bootstrap4 html https
  • CSS负右背景位置

    我知道我可以在背景图像上设置负左位置 如下所示 element background url image png 20px 0 no repeat 这会将背景图像定位到左边缘左侧 20px element 不管 element的宽度 但是有
  • python,即时动态实现一个类

    假设我有一个实现多种方法的类 我们希望用户选择在现有方法中运行哪些方法 或者他可以决定添加任何 on the fly 方法 从例子 class RemoveNoise pass 然后根据需要添加方法 RemoveNoise raw Raw
  • 如何在 JavaScript 中将变量从一个文件发送到另一个文件? [复制]

    这个问题在这里已经有答案了 我想从页面发送用户名和密码login html to index html 我怎样才能尽可能简单地做到这一点 以及如何对字符串进行编码 使其采用 URL 编码和 UTF 8 Cheers 您可以使用cookies
  • git 如何处理文件夹权限?

    我正在使用 git 版本 1 5 6 3 并且 git 似乎没有注意到文件夹模式的更改 create a test repository with a folder with 777 mode mkdir p test folder tou
  • 在 Mac OS X 上打开磁盘设备文件进行写访问

    我正在尝试对 Mac 上的磁盘分区表进行细微修改 特别是 我需要更改分区的类型 diskutil不支持这个 所以我不能使用它 它工作正常 例如通过修改gpt命令行实用程序 如果磁盘未使用 如果是 则打开设备文件失败 int fd open
  • Dart List - 子类型过滤器

    在我的 dart 项目中 构造经常出现在许多情况下 对于具有子类型的类型列表 此代码将子类型过滤到新列表中 class A class AChild extends A List a alist new A new AChild List
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • 如何在不使用“Qt项目”的情况下在Eclipse中设置QT路径?

    我有一个在 Eclipse 中管理的混合 C Qt Python 项目 我想设置 Qt 路径 而不将我的项目设置为 Qt 项目 使用 CDT 并将其设置为常规 来自现有代码的 Makefile 项目 我在项目属性中找不到任何可以设置 Qt
  • 可以自定义printf吗?

    我有一些需要经常打印的结构 现在 我在这个结构周围使用经典的打印包装器 void printf mystruct struct my struct if my struct NULL return printf value1 d value
  • 有没有办法将行号重新引入堆栈跟踪?

    我正在使用一个库 它通过直接抛出一个对象来混淆错误 我相信 Functions a b b2 c are all in a library that I don t have control over function a console
  • 如何为 JDialog 设置圆角的 3D 边框?

    我可以向 JDialog 添加圆角边框 如下所示如何在 Java Swing 中创建圆形标题边框 https stackoverflow com questions 3056089 how to create a rounded title
  • 如何在 Presto 中将时间戳转换为日期?

    我喜欢将时间戳列转换为日期和时间格式 我应该如何从 presto 编写查询 我的时间戳是UTC时间 非常感谢 Timestamp format 1506929478589 After query convert it looks like
  • Android 键盘“前往”按钮至“搜索”

    任何人都可以告诉如何用 搜索 代替 Android 键盘中的 执行 或 完成 按钮 不是放大镜 像这样的东西 android imeOptions actionSearch 可能会起作用 在你的情况下 还有其他选项 例如 android i
  • 如何反转列表?

    在Scheme中反转列表的函数是什么 它需要能够处理嵌套列表 所以如果你做类似的事情 reverse a b c d e 你会得到 e b c d a 作为输出 我应该如何解决这个问题 我不仅仅是在寻找答案 而是寻找有助于我学习的东西 de
  • SAS 哈希表:有没有办法在不同的键上查找/连接或具有可选键

    我经常处理一些键不完美的数据 并且我需要连接来自不同源的数据 我想继续使用哈希对象以获得速度优势 但是当我使用大量数据时 我可能会遇到崩溃 记忆限制 一个简单的概述是我有 2 个不同的键 它们都是唯一的 但并非每条记录都存在 我们将它们称为