【发布时间】:2021-02-24 12:53:50
【问题描述】:
我们尝试使用 SAS XML 映射器读取 3-4 GB 的 XML 文件。但是当我们 PROC 将数据从 XML 引擎复制到 SAS 数据集时,它需要将近 5 到 6 分钟,这对我们来说太长了,因为我们必须每天处理 3000 个文件。我们正在并行运行近 10 个文件。一个表几乎有 230 列。
还有其他更快的方法来处理 XML 吗? 我们可以使用 PROC GROOVY 吗?会有效率吗?如果是,任何人都可以为我提供示例代码吗? 我尝试在线搜索但无法获得。
XML 包含 PII 数据及其 3 GB 的巨大数据。
运行的代码非常简单直接:
filename NHL "/path/ODM.xml";
filename map "/path/odm_map.map";
libname NHL xmlv2 xmlmap=map;
proc copy in=nhl out=work;
run;
创建的表总数:54 个,其中超过 14 个表有 ~18000 条记录,其余表有 ~1000 条记录
日志窗口显示
NOTE: PROCEDURE COPY used (Total process time):
real time 4:03.72
user cpu time 4:00.68
system cpu time 1.17 seconds
memory 32842.37k
OS Memory 52888.00k
Timestamp 19/05/2020 03:14:43 PM
Step Count 4 Switch Count 802
Page Faults 3
Page Reclaims 17172
Page Swaps 0
Voluntary Context Switches 3662
Involuntary Context Switches 27536
Block Input Operations 504
Block Output Operations 56512
SAS Version : 9.4_M2
我们服务器中的总内存大小为MEMSIZE=3221225472
总共 3000 个文件,其中 1000 个为 3 到 4 GB,其中一些为 1 GB,1000 个文件以 KB 为单位。较小的文件得到快速处理,问题仅在于大文件。它几乎使用整个 CPU。
当我们减少文件数量时,来自 XML 引擎的复制时间会有所不同,但为此我们必须更改映射文件或输入 xml。
已经提出了 SAS 轨道并在 SAS 社区中提出了同样的质疑,但仍然没有运气。看起来就像它的解析器限制本身。
对 Teradata 中的碎纸机有任何想法吗?会不会有效率?
【问题讨论】:
-
显示您的代码和日志消息。描述您的系统资源、CPU 和 RAM。所有 3,000 个文件都使用同一张地图吗? ?如果是这样,那张地图是什么时候创建的? Mapper 制作 XMLMap 文件需要多长时间?您可以上传一个示例 xml 文件并将其映射到 pastebin.com 等网站吗?
-
旁注:您可以编辑您的帖子以进行更正并包含更多信息。编辑不应实质性地改变问题并提出新问题。如果有新问题,请创建一个新问题。我编辑了主题并添加到您在评论中添加的日志消息。另外,您能否澄清一下,您有 3,000 个 3-4GB 大小的文件,还是 3,000 个总大小为 3-4GB 的文件。
-
如果您正在处理 PII 数据,您应该联系 SAS 支持并打开跟踪。在此期间,您是否尝试过在
config.sas中增加MEMMAXSZ选项。此外,XML引擎可能会在可用于 SAS 私有运行时 JRE 的资源中遇到瓶颈。最后,您可以将 community.sas.com 用于需要更多线程对话的主题。 -
我无法想象 SAS 真的能够帮助解决这个问题 - 3000 个文件,每个文件大小只有几 GB?这是大量的 ETL。您需要一个非常大的服务器才能有效地运行该程序。听起来他们已经在以正确的方式做事了——并行运行 10 次 300 组作业,每组 300 x 4-5 分钟。只是 SAS 不是为了做得好而构建的。
-
将地图修改为一次只读取 54 个表中的一个会更快吗?