对于超大数据量的程序处理

我们在写程序的时候可能会遇到用内表处理超大量数据的情况,比如取MSEG、BSEG表,内表里的数据如果超过2G就会报程序dump了,所以关键是要控制内表的数据量。

以下载一个系统表的数据为例,选择界面输入系统表名,用户点执行则将系统表数据下载到本地或进行其他处理。

第一步,计算系统表一条数据占用的内存;

第二步,计算内表最多可以存多少条数据;

第三步,每次处理最大条目数的数据。


PARAMETERS : p_table TYPE ddobjname.

DATA : db_cursor TYPE cursor.
DATA : lt_dfies       TYPE TABLE OF dfies,
       ls_dfies       TYPE dfies,
       struc_size     TYPE i VALUE 0,
       g_package_size TYPE i.
FIELD-SYMBOLS : <xtab> TYPE ANY TABLE.
DATA : l_refitab TYPE REF TO data.
CREATE DATA l_refitab TYPE TABLE OF (p_table).
ASSIGN l_refitab->* TO <xtab>.

* 取系统表结构
CALL FUNCTION 'DDIF_NAMETAB_GET'
  EXPORTING
    tabname   = p_table
  TABLES
    dfies_tab = lt_dfies
  EXCEPTIONS
    not_found = 1
    OTHERS    = 2.
IF sy-subrc <> 0.
  EXIT.
ENDIF.

** 每个数据包的逻辑
* 计算一条数据占用的内存
LOOP AT lt_dfies INTO ls_dfies.
  struc_size = struc_size + ls_dfies-leng.
ENDLOOP.

***** 计算2G内存可以存储多少条数据
g_package_size = 2147483648 / struc_size.

OPEN CURSOR WITH HOLD db_cursor FOR
SELECT * FROM (p_table)
BYPASSING BUFFER.
DO.
*** 每次取2g的数据包
  FETCH NEXT CURSOR db_cursor
  INTO CORRESPONDING FIELDS OF TABLE <xtab>
  PACKAGE SIZE g_package_size.
  IF sy-subrc NE 0.
    CLOSE CURSOR db_cursor.
    EXIT.
  ENDIF.

*** 对数据包的进一步操作--略
ENDDO.

同理,程序逻辑中遇到内表超内存dump也可以分批次处理,比如销售订单的全流程跟踪中,从VBAK中取出50万条销售订单数据,然后根据这些销售订单作为索引去取数据流中交货单、发票等等信息,一次性处理这50万条数据可能就会程序dump,可以定义一个索引内表,10万或者5万一次来执行后面的逻辑,从而避免程序dump。

PS:喜欢的同学可以关注微信公众号
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值