2

我最近发布了一个主机报告程序的更新。我们的商店使用 Enterprise PLI。

我添加了 2 个声明为 BASED 的新结构。所以我基本上使用 ALLOC 语句为结构分配所需的存储空间,然后将指针传递给 Fetchable 以获得我需要的一些细节。

它在生产试运行期间因存储错误而失败(下面的 LEMSG)。它试图在那里处理超过一百万条记录,看来这项工作基本上已经用完了存储空间。

IBM0451S  ONCODE=451  The STORAGE condition was raised.                         
From entry point MXXX at compile unit offset +000001EA at entry offset 

更多细节:IBM0451S

作为修复,我正在发布更新以在 Fetchable 调用之后为存储显式添加免费,并且我还将 JCL 的 REGION PARM 更新为 0M。

我想我会检查你以前是否见过这种错误并有任何额外的想法。谢谢。

这是我最新更新的代码的样子

DECLARES
  =======================================
  DCL                                     
   01 IN_DATA  BASED(IN_PTR),       
     % INCLUDE SYSLIB(XXXXXPAA);          
  DCL                                     
   01 OUT_DATA BASED(OUT_PTR),      
     % INCLUDE SYSLIB(YYYYYPAA);          

  DCL                                     
   01 IN_PTR        PTR;                  
  DCL                                     
   01 OUT_PTR       PTR;  

 ======================================

 The below block of code runs for every record that get processed. The    
 FREE statement is what i now added. I was thinking that because i did 
 not have a FREE before , the ALLOC was basically getting new STOARGE
 everytime it executed that block of code and ran out of storage.



 ALLOC IN_DATA;                              
 ALLOC OUT_DATA;                             

 IN_DATA  = '';                              
 OUT_DATA = '';                              

 IN_DATA.CODE =  'XXX';

 CALL FABCD(IN_PTR,                                 
            OUT_PTR);                               

 IF OUT_DATA.RTRN_CD <= 04 THEN               
   DETAIL_REC.XYZ = OUT_DATA.YYY_CODE;   
 ELSE                                               
  ;                                                 


 FREE IN_DATA;    -------->> What i added now                         
 FREE OUT_DATA;   -------->> What i added now                             

=============================================   
4

2 回答 2

2

除了存储问题的观点,为每个记录进程分配和释放存储是巨大的性能杀手。

从您展示的片段来看,尚不清楚 a)为什么首先 ALLOC,以及 b)为什么您认为每条记录都需要一个新的存储空间。

只需在本地分配结构,将指向它们的指针传递给函数。

DCL 01 IN_DATA,       
    % INCLUDE SYSLIB(XXXXXPAA);
DCL 01 OUT_DATA,      
    % INCLUDE SYSLIB(YYYYYPAA);          

DCL IN_PTR        PTR INIT ( ADDR( IN_DATA) );                  
DCL OUT_PTR       PTR INIT ( ADDR( OUT_DATA ) );

这将使 PL/I 只分配一次结构,但仍允许将指向存储的指针传递给函数例程。

我还将删除第二个性能杀手:可能不需要的结构初始化

IN_DATA  = ‘‘;
OUT_DATA = ‘‘;

这会逐个字段初始化。除非你有充分的理由,否则不要这样做。

于 2018-11-12T09:33:16.150 回答
0

这是预期的行为。根据您的描述,您的初始代码存在内存泄漏,分配存储而不释放它。现在您已经添加了代码以在不再需要分配的内存时释放它,您可能不需要 REGION=0M,尽管如注释中所示,它可能无论如何都不会做您想要的。

于 2018-11-10T15:41:37.153 回答