【问题标题】:Proc Groovy to parse larger XML into SASProc Groovy 将较大的 XML 解析为 SAS
【发布时间】: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 个表中的一个会更快吗?

标签: groovy sas


【解决方案1】:

我将分两部分进行,首先将 XML 转换为 ascii,然后再转换为 SAS。 SAS 在将 XML 转换为 SAS 方面不会很快。这不是 SAS 优化的东西。您几乎完全使用了 CPU 时间,因此您不受磁盘限制 - 您受到 SAS 解析 XML 文件的能力的限制。

用更优化的语言编写程序,可以更快地解析 XML,然后将结果读入 SAS。 Python 可能是一种选择——它也不是超级优化的,但它比我怀疑的 SAS 更优化——或者甚至更低级别的语言(如 c/c++)可能是你最好的选择.

【讨论】:

  • 有没有其他方法来解析 XML。我目前正在尝试 teradata 中的碎纸机。
  • 您当然可以使用数据步骤代码解析 XML,但不推荐使用 - xml 映射更好。但就像我说的那样,最好不要为此使用 SAS - 你正在“用低级语言编写自定义解析器”,这里有你正在谈论的数字。大概也是在“花钱请个顾问写这个”的地步。每天 1000+ 3Gb XML 文件可不是小菜一碟。
  • 感谢您的建议。大多数人建议使用外部解析器来解析 XML。仍然可以通过 proc groovy 吗?你对 proc groovy 有什么建议吗
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多