SAS HASH :内存失败时,Hash对象添加了***个项

处理千万观测数据的小伙伴,辛苦等了一两个小时,结果发现以下报错,心如死灰:

ERROR: 内存失败时,Hash 对象添加了 4587504 个项。

FATAL: 内存不足,无法执行 DATA 步程序。 在“EXECUTION”阶段中止。
ERROR: 由于内存不足,SAS 系统停止了对该步的处理。
NOTE: 从数据集 WORK.T_QUERY. 读取了 82425420 个观测
WARNING: 数据集 D.T_QUERY 可能不完整。该步停止时,共有 4587503 个观测和 97 个变量。
NOTE: 压缩的数据集 D.T_QUERY 大小减少了 57.82%。
压缩为 23037 页;不压缩将会要求 54614 页。
WARNING: 数据集 D.T_QUERY 由于该步已停止,而没有被替换。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 1:53:01.74
CPU 时间 1:51:28.01

难道HASH不是像传说中那么好用,也受到内存的限制?即使我的电脑内存是128G,仍然无法避免上述错误,那么告诉你一个简单容易忽略的解决办法:

在DATA步最后添加:H.CLEAR();

H是前面定义的hash名称;

就这么简单,问题解决了!!!!!因为H.CLEAR();释放了前面存储的每个KEY及对应的DATA内存,除非单个key和data的内存达到上限,否则再也不会报上述的错啦

时间: 2024-10-10 20:54:49

SAS HASH :内存失败时,Hash对象添加了***个项的相关文章

new内存失败后的正确处理(转)

本文摘录自建议30:new内存失败后的正确处理. 应该有很多的程序员对比尔盖茨的这句话有所耳闻: 对于任何一个人而言,640KB应当是足够的了.(640K ought to be enough for everybody.) 不幸的是,伟大的比尔盖茨也失言了.随着硬件水平的发展,内存变得越来越大,但是似乎仍不能满足人们对内存日益增长的需求.所以呢,我们C/C++程序员在写程序时也必须考虑一下内存申请失败时的处理方式. 通常,我们在使用new进行内存分配的时候,会采用以下的处理方式: 1 char

C++new失败的处理(如果 new 分配内存失败,默认是抛出异常的,但也可以取消异常)

我们都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的.但是,如果你简单地把这一招应用到 new 上,那可就不一定正确了.我经常看到类似这样的代码: int* p = new int[SIZE];        if ( p == 0 ) // 检查 p 是否空指针            return -1;        // 其它代码 其实,这里的 if ( p ==

C#把对象类型转化为指定类型,转化失败时返回该类型默认值

/// <summary> ///通用类型扩展方法类 /// </summary> public static class ObjectExtensions { /// <summary> ///把对象类型转化为指定类型,转化失败时返回该类型默认值 /// </summary> /// <typeparam name="T"> 动态类型 </typeparam> /// <param name="v

内存充足时,malloc内存分配失败问题

如题,为什么内存充足时,malloc内存分配失败? 首先,在32位平台下,系统最多可管理4G内存,其中2G系统自用,剩下2G可供用户使用,然而在实际分配时,用户可用空间始终小于2G(若有童鞋在如上条件下分配空间 等于或大于2G可以联系我哦,以让我纠正自己的错误).64位则可以管理好多,有兴趣的童鞋可以自己算下哦! 那么,这些跟malloc内存分配失败有什么关系呢有什么关系呢?哈哈,问题就在这里,32位平台下就不多说,相信上面的叙述可以解决童鞋们的问题.在64位平台下,童鞋们是不是发现依旧只能分配

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关. 举一个简单的例子,如下代码: #include <stdio.h> class A { public: int x; void foo1()

海量路由表可以使用HASH表存储吗-HASH查找和TRIE树查找

千万别!很多人这样说,也包括我.Linux内核早就把HASH路由表去掉了,现在就只剩下TRIE了,不过我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix hash 和tire其实是可以统一在一起的.具有相同hash值的多个项具有一个共同的特征,这个特征怎么提取呢?无疑这就是hash函数的工作.而trie树 (或者radix树,管它呢)的一棵子树也有共同的特征,这个特征怎么提取呢?无疑这就是该子树根节点的父节点指示的某些bits在这棵子树的每一个节点 都具有相同的

(转)深入理解JavaScript的闭包特性 如何给循环中的对象添加事件

深入理解JavaScript的闭包特性如何给循环中的对象添加事件 初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript的闭包特性. 有个网友问了个问题,如下的html,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4. 1.  <!DOCTYPE HTML> 2.  <html> 3.  <head&g

深入理解JavaScript的闭包特性如何给循环中的对象添加事件

初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript的闭包特性. 有个网友问了个问题,如下的html,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4. 1.  <!DOCTYPE HTML> 2.  <html> 3.  <head> 4.  <meta charset="utf

【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM

本文内容来源于<深入理解Java虚拟机>一书,非常推荐大家去看一下这本书.最近开始看这本书,打算再开一个相关系列,来总结一下这本书中的重要知识点.呃呃呃,说好的那个图片请求框架呢~  不要急哈,因为这个请求框架设计的内容还是比较广的,目前业余时间正在编写当中,弄好了之后就会放上来.在完成之前,咱还是先来学习一下其他知识. 1.内存模型 java虚拟机在执行java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,如下图所示: 图片来源于网络 (1)程序计数器(Program Count