l****i 发帖数: 398 | 1 我们用的是EG5.1在Unix Server上跑的SAS.昨天在用proc sql leftjoin做两个比较大
的数据合并的时候porc sql跑了大概2个小时最后还是报错终止了。错误信息如下:
ERROR: An I/O error has occurred on file VOD.DEMO_LIVEDVR_HHS_BIG5PRIME.DATA.
ERROR: File VOD.DEMO_LIVEDVR_HHS_BIG5PRIME.DATA is damaged. I/O processing
did not complete.
想问一下这大概是什么原因导致,有什么办法解决?
我的code很简单其实就是把一个家庭户level数据中的一个demo变量合并到一个关于家
庭户在11月晚间所有电视节目的收视数据中去。家庭户demo数据有2.7 million个row总
共1.8G, 收视数据有126 million个row,总共11.5G。收视数据中的unique家庭户和demo
数据中的unique家庭户会有些出入,两个文件通过家庭id link起来。下面是完整log,
请大牛看看是啥问题导致的,如何解决!
15 /*merge with demo_tagged infor from demo_livedvr_viewing_hhs*/
16 PROC SQL;
17 CREATE TABLE vod.demo_livedvr_hhs_big5prime AS
18 SELECT a.*,
19 b.hhs_type,
20 b.demo_tagged
21 FROM vod.livedvr_telehhs_big5prime a LEFT JOIN vod.demotagged_
livedvr_hhs b
22 ON a.headend_no = b.headend_no AND b.hh_no = b.hh_no;
ERROR: An I/O error has occurred on file VOD.DEMO_LIVEDVR_HHS_BIG5PRIME.DATA.
ERROR: File VOD.DEMO_LIVEDVR_HHS_BIG5PRIME.DATA is damaged. I/O processing
did not complete.
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of
statements.
23 QUIT;
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE SQL used (Total process time):
real time 2:26:37.46
cpu time 52:27.33
|
p********a 发帖数: 5352 | 2 用MERGE BY试试吧。你这个多半是MEMORY出错。PROC SQL JOIN两大TABLE不很
EFFICIENT |
s******8 发帖数: 102 | 3 没用过EG,用词不专业的话请别笑。
1.你确信demotagged_livedvr_hhs中,headend_no and hh_no是唯一的吗?如果两边都
不是唯一,就可能生成一个很大的新表,导致错误。当然大量记录缺失Key值应该不会
发生,但确认一下或许也有帮助。
试一下:
PROC SQL;
CREATE TABLE vod.demo_livedvr_hhs_big5prime AS
SELECT a.*,
b.hhs_type,
b.demo_tagged
FROM vod.livedvr_telehhs_big5prime a LEFT JOIN
(select distinct headend_no,hh_no,hhs_type,demo_tagged from vod.demotagged_
livedvr_hhs) b
ON a.headend_no = b.headend_no AND b.hh_no = b.hh_no;
2.有过I/O ERROR 经验是大数据存在shared网络存储器上,导致本地机读写错误。确认
一下,你的问题不是存储器与主机间通路堵塞造成的I/O。尤其是当你产生的文件巨大
情况下。 |
r**********d 发帖数: 510 | 4 AND b.hh_no = b.hh_no; typo there ? |
b********1 发帖数: 291 | 5 nice catch. I think the typo caused a 'self_join'. |
l****i 发帖数: 398 | 6 多谢各位回复。后来确认问题确实是服务器内存不够了。把temp directory都塞满了,
然后就终止程序了。后来解决办法是吧那个126million的大表分割成3个文件,然后
LEFT JOIN。最后5分钟不到完成了。 |
l****i 发帖数: 398 | 7 确认应该是typo引起的问题,然后把TEMP DIRECTORY撑爆了。我后来把typo改了重新跑
了一
变,没有分割文件,5分钟不到也跑出来了。 写code还是要仔细啊!
【在 r**********d 的大作中提到】 : AND b.hh_no = b.hh_no; typo there ?
|
l****i 发帖数: 398 | 8 恩,那为什么'self join'会把内存撑爆呢?
【在 b********1 的大作中提到】 : nice catch. I think the typo caused a 'self_join'.
|
D******n 发帖数: 2836 | 9 内存还是硬盘?
【在 l****i 的大作中提到】 : 多谢各位回复。后来确认问题确实是服务器内存不够了。把temp directory都塞满了, : 然后就终止程序了。后来解决办法是吧那个126million的大表分割成3个文件,然后 : LEFT JOIN。最后5分钟不到完成了。
|
l****i 发帖数: 398 | 10 server上的temp directory。我也不知道算内存还是硬盘。之前这个问题报错的时候服
务器的提示是Disk Usage is CRITICAL, mnt/nfs/vol_na1_corplivesas2_nfs1/
mounts = 99% 同事给了我两个解决办法,1.用服务器的客户端写command line调用最
大内存跑sas程序:/opt/sas93/SASFoundation/9.3/bin/sas_en -memsize 0 your_
program.sas&
2.就是把数据分割一下跑。
【在 D******n 的大作中提到】 : 内存还是硬盘?
|
D******n 发帖数: 2836 | 11 内存跟硬盘两回事。。。。你这个是硬盘。
很可能是找了个小盘做work
可以redirect一下 work
sas -work /xx/xxx/xx your_program.sas&
【在 l****i 的大作中提到】 : server上的temp directory。我也不知道算内存还是硬盘。之前这个问题报错的时候服 : 务器的提示是Disk Usage is CRITICAL, mnt/nfs/vol_na1_corplivesas2_nfs1/ : mounts = 99% 同事给了我两个解决办法,1.用服务器的客户端写command line调用最 : 大内存跑sas程序:/opt/sas93/SASFoundation/9.3/bin/sas_en -memsize 0 your_ : program.sas& : 2.就是把数据分割一下跑。
|