System.OutOfMemoryException thrown on JSONTABLE with Twinfield BI-ON-Focus

Graag oplossing voor bovenstaand probleem.

Lijkt of hij de bulk aan data van onder andere Transactieregels niet weg kan schrijven naar de database.
Dit voor een tiental klanten al ervaren.

Version: 20.0.134.1716

Kun je de informatie zoals beschreven op Provide Support with Data Replicator repository and logging toevoegen?

In ieder geval de call stack en error code (itgenxxx999).

Treedt deze melding nog op?

Ja, bij onze Twinfield klanten treed deze issue nog iedere dag op bij het inladen van de Transactieregels

Kun je de informatie zoals beschreven op Provide Support with Data Replicator repository and logging toevoegen?

In ieder geval de call stack en error code (itgenxxx999).

Ik begrijp dat het om Twinfield gaat. Gelieve ook de exacte tabelnaam en query op te geven.

Hoi Guido, Excuus voor de onduidelijke vraag. De fout treedt op bij een

create or replace table xyz@inmemorystorage

via de httpdownload in DataDictionary, niet via de Twinfield connector. De totale omvang van de JSON-files die worden gedownload is 1.335 mb. Beta-store-facts-on-disk staat uit.

Toch wil hij de inmemory niet aanmaken en loopt hij na 40 minuten op de System.OutOfMemoryException, terwijl ik ze via curl in 1 min 25 sec binnen heb.

Welke van deze componenten heeft een limiet?

Zou je het volledige SQL statement hier willen toevoegen?

In Query Tool 20.0.145 is dit de foutcode:

itgenclr007: Application is using more memory than available. Restarting the application, use 64-bit Windows and Office or making more memory available might resolve this problem.

Er is een uitzondering opgetreden van het type System.OutOfMemoryException.

Message ID: bfce3548-93c8-4975-9d88-7256e2a86aaf

Occurred (UTC): 21-4-2021 08:31:04

create or replace table xyz@inmemorystorage
    as
    select dta.*
    from   httpdownload@datadictionary
           ( url => 'https://twinfield.[jeweetwelkepartij].nl/general-ledger-details?type=frozen'
           , contentType => 'application/json'
           , headers => 'Authorization=Basic%20' || urlencode(base64_encode(ascii_to_blob([auth_code])))
           ) htp
    join   jsontable
           ( '[*][*]'
             passing htp.content_clob
              columns   divisionname          varchar2 path '[''Company name'']'
              ,         financialyear         varchar2 path '[''Year'']'
              ,         financialperiod       varchar2 path '[''Period'']'
           ) dta

Het bestand is ruim 1 GB:

curl -i -H "Authorization: Basic [auth_code]" https://twinfield.[jeweetwelkepartij.nl/general-ledger-details?type=frozen > c:/temp/test.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1079M    0 1079M    0     0  5341k      0 --:--:--  0:03:27 --:--:-- 6223k

Dank voor statement.

De OutOfMemory exception bij het inlezen vanuit (ik gok) BI ON Focus PowerBI for Twinfield is verwacht gedrag. Mogelijk dat er in de toekomst een uitbreiding komt voor dergelijke grote downloads.

Achterliggend probleem is dat er wel 64-bits processen zijn, maar dat bijvoorbeeld een aaneengesloten tekst maximaal 2 GB lang mag zijn. Aangezien Invantive SQL werkt met twee bytes per karakter is de theoretische limiet 1 miljard tekens (1 Unicode karakter per 16 bits).

De download is ruim 1 GB na decompressie, maar het opslagformaat is waarschijnlijk UTF-8 (meeste Unicode karakters vergen 8 bits, sommigen tot/met 32 bit). De download kan dus niet in een 2 GB tekst opgenomen worden. Dit is vergelijkbaar met de veelvoorkomende lengtebeperking van 2 GB (na omzetting UTF 8 in UTF 16) voor blob en clob op platformen zoals Oracle en PostgreSQL.

Waarschijnlijk staat er in de call stack iets zoals:

System.OutOfMemoryException
ValidationException
   bij System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encoding)
   bij System.Text.UTF8Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)
   bij Invantive.Data.DataDictionaryProvider.FetchYieldUnfilteredInternal(GlobalState owner, ExecutionOptions executionOptions, EntityFieldCollection entityFields, QueryObject queryObject, ParameterList parameters, Boolean fetchSingle, Boolean fetchCountFirst, Int32 pagingSteps, Boolean fetchCount)

Het filteren van de data met een on zoals:

select ...
from   httpdownload@datadictionary(...)
join   jsontable() t
on    t.kolom = waarde

zal niet helpen. De HTTPDownload mislukt al omdat er meer dan 2 GB aan karakterdata in UTF-16 nodig is.

Aanbevolen oplossing is om over te stappen op Invantive’s eigen Twinfield driver voor Power BI of Data Replicator. Die heeft intern een streaming architectuur en object-georiĂ«nteerde structuur waardoor datavolumes van 32 GB of meer geen probleem zijn (mits het OS dat ondersteunt en 64-bit proces gebruikt wordt). Het datamodel zal waarschijnlijk vergelijkbaar zijn. Om traffic naar Twinfield te beperken wordt ook gewerkt met automatisch bepaalde server-side filters zoals beschreven in Filteren op velden uit de Twinfield API.

Er kan dan gewerkt worden met:

select count(*) from TWINFIELDTABEL

om de data in SQL Server te krijgen of met tussenstap met filter:

create or replace table xyz@inmemorystorage
as
select /*+ ods(false) */
       *
from   TWINFIELDTABEL
where  kolom = WAARDE

select /*+ ods(true, interval '0 seconds') */ count(*) from xyz@inmemorystorage

Het maken van een Twinfield settingsbestand staat beschreven in bijvoorbeeld Instellingen voor koppeling naar Twinfield.

Correct. Ik heb inmiddels de klant om nieuwe inloggegevens gevraagd om de Invantive Twinfield driver te kunnen gebruiken. Ze zullen dan echter de rapporten moeten aanpassen, maar dat lijkt voor nu de beste oplossing. Het probleem met de bestandsgrootte heb ik toegelicht aan hen. Bedankt voor de reactie.

1 Like

Goedemorgen,

Ik krijg (bijna) zelfde melding bij download vanuit EOL:

2021-04-29 08:05:03.826 Warning itgendhb173: Context: begin xxdru_maintain_table_partitions(true, false); end;
2021-04-29 08:05:04.357 Error itgencun016: Error -20163: 4 errors occurred during maintenance of table partitions: Exception of type ‘System.OutOfMemoryException’ was thrown.
One or more errors occurred.
Exception of type ‘System.OutOfMemoryException’ was thrown.
Exception of type ‘System.OutOfMemoryException’ was thrown.
Exception of type ‘System.OutOfMemoryException’ was thrown.
2021-04-29 08:05:06.716 Error -20163: ValidationException
at Invantive.Basics.ValidationException
ctor(GlobalState owner, ExecutionOptions executionOptions, String messageCode, String messageText, String kindRequest, String localStackTrace, String nk, Exception innerException, Boolean inheritMessageCodeWhenPresent, Nullable1 uid, Boolean isRecoverable, String poolIdentityId) at Invantive.Sql.V1.PSqlParser.CreateValidationException(GlobalState owner, ExecutionOptions executionOptions, String messageCode, String text, String kindRequest, String naturalKey) at LambaExecutePSqlTree155(Closure , ISparseArray , ISparseArray ) at LambaExecutePSqlTree188(Closure , ISparseArray , ISparseArray ) at Invantive.Sql.V1.PSqlStatementTree.<Fetch>d__29.MoveNext() at Invantive.Data.CompressedEnumerable1.d__10.MoveNext()

Enig idee wat ik hier aan kan doen?

Voor Exact Online zal het een andere oorzaak hebben dan via HTTP de Twinfield Proxy BI-ON-Focus uit te lezen. Misschien dat dit antwoord soelaas biedt; Error itgendhb212: External error in Invantive Data Hub. (out of memory)