Tony had a point in that redesign would probably give better performance,
but here are some thoughts that may be helpful in the short term.

1) Using a multi-dimensioned array would be a little faster:

   IF BAL # 0 THEN
      MV=MV+1
      BIG(MV,1)=ID
      BIG(MV,2)=SOMETHING ELSE
      etc.

2) In regard to an opposite of REMOVE, there really isn't a function but
rather a technique.  Create a large buffer and use substring assignment,
e.g.

   BUFFER = SPACE(999999)
   BUFPTR = 0
   LOOP
      VAR = SOMETHING
      L = LEN(VAR)
      BUFFER[1+BUFPTR, L] = VAR    ; * substring assignment
      BUFPTR += L
   LATHER RINSE REPEAT

I've used code like this when building large strings and it's very fast.  If
you get near the end of the buffer, you can always double its size.

> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Behalf Of Mark Johnson
> Sent: Friday, August 12, 2005 12:26 AM
> To: [email protected]
> Subject: [U2] Remove Scenario
>
>
> Here's a doozy.
>
> Thanks for the previous suggestion of using REMOVE instead of the <>
> extractions. That's working very well.
>
> New problem.
>
> One client's application is written in The Programmer's
> Helper (TPH) which
> MATREADS and has EQUATES assigning variables like INVNO.TABLE
> TO CUST(40)
> etc.
>
> The program is written with INVNO.TABLE<1,X> style extracts
> everywhere. There
> are probably 15 mv'd fields with the suffix TABLE and their
> mv counters are in
> sync.
>
> Prior to using REMOVE (it had an issue on D3), I MATREAD in a
> BIG(300000)
> array which breezed through the high item count of 155,000
> records.(REMOVE
> took 8 seconds, BIG took around 12 and <> took over 9 minutes).
>
> Here's the rub. This is a Cash Reciept application where the
> BIG array is one
> customer's invoices. The load-in process jogs through the BIG
> array and for
> those items with a non-zero balance, it creates these 15
> TABLE variables.
> Trouble is, if there's 155,000 total records for this 1
> customer, 100,000 may
> have a balance of zero leaving 50,000 to be handled in the
> application.
>
> So while REMOVE is a great way to extract from BIG as a
> dynamic array and
> MATREAD is great for extracting from a DIM array, what would
> be the best way
> to build these 15 separately named TABLE variables. The
> original program (sans
> REMOVE) looked like this:
>
> C=DCOUNT(BIG,CHAR(254))
> FOR I=1 TO C
>     ID=BIG<I>
>     READV BAL FROM ARFILE, ID, 10 THEN
>         IF BAL # 0 THEN
>             INV.TABLE<1,-1>=ID
>             AAA.TABLE<1,-1>=SOMETHING ELSE
>             BBB.TABLE<1,-1>=SOMETHING ELSE
>             CCC.TABLE<1,-1>=SOMETHING ELSE
>             MMM.TABLE<1,-1>=SOMETHING ELSE
>         END
>     END
> NEXT I
>
> So while REMOVE is a great extractor for these 150,000
> fields, what is a great
> inserter for these 15 TABLE variables. In essence, the BAL #
> 0 is 50,000
> records.
>
> I tried
> MV=MV+1
> INV.TABLE<1,MV>=ID
> etc
>
> and got a minor improvement.
>
> I tried
> INV.TABLE:[EMAIL PROTECTED]:SOMETHING ELSE
> etc
>
> and got a slightly better improvement.
>
> In either case, you could see the progressive (exponential)
> delay as it
> performs these 50,000 (x 15) TABLE actions.
>
> I tried using my DIM BIG(300000) where the dim element number was the
> insertable MV and I used the dynamic array concept on each
> dimensioned array
> element. Thus:
>
> MV=0 ; L=0
> LOOP
>     REMOVE ID FROM XREF AT L SETTING D
>     READV BAL FROM ARFILE, ID, 10 THEN
>         IF BAL # 0 THEN
>             MV=MV+1
>             BIG(MV)<1>=ID
>             BIG(MV)<2>=SOMETHING ELSE
>             BIG(MV)<3>=SOMETHING ELSE
>             BIG(MV)<15>=SOMETHING ELSE
>         END
>     END
> UNTIL D=0 DO ; REPEAT
>
> and it took only 8 seconds. Cool. So now I have a dimensioned
> BIG array with
> 50,000 elements each having 15 attributes.
>
> Because the infidel TABLE variables are scattered throughout
> this generated
> 1,500 line program, I don't want to search and replace them
> all with their
> BIG(MV)<12> equivilents unless I really have to. Eventually,
> I have to take
> these mv'd TABLE variables and writev (sic) them onto the data file.
>
> MATBUILD doesn't seem to work with 2 dimensioned dimensioned
> arrays nor with
> elements containing attributes or values. It only likes the
> elements being
> simple variables.
>
> If this were a report program I would kick it off on a
> phantom and be done
> with it. Since it's a user oriented Cash Receipts program,
> the user literally
> waits 5-9 minutes while a single customer 'loads'. Of course,
> the larger more
> important customers are handled more frequently, thus more headaches.
>
> So the question is whether there is an INSERT or append
> function with the
> magic of REMOVE.
>
> Thanks for any insights.
> Mark Johnson
> -------
> u2-users mailing list
> [email protected]
> To unsubscribe please visit http://listserver.u2ug.org/
-------
u2-users mailing list
[email protected]
To unsubscribe please visit http://listserver.u2ug.org/

Reply via email to