Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
bonjour, je cherche à transformer un XML très volumineux (plus de 15 Go, plusieurs millions de lignes) en QVD mais Qlik sur mon PC n'arrive pas aller au bout du fichier (insuffisance de mémoire).
Mon script est un simple import du XML à 13 champs dans une table appelée [REV]:
[REV]:
LOAD
VersionName,
PeriodName,
RespCenterName,
RevenueTypeName,
CostObject1Name,
CostObject2Name,
CostObject3Name,
CostObject4Name,
CostObject5Name,
CurrencyName,
UnitPrice,
UnitsSold,
Revenue
FROM [..\Data XML\REV.XML] (XmlSimple, Table is [PPAData/Action/RevenueRecord]);
STORE [REV] INTO [..\Data QVD\REV.qvd] (qvd);
Drop table [REV];
Voyant que cela ne passe pas, j'ai limité à 100 000 1ères lignes avec :
LET vFirst = 100000;
FIRST $(vFirst) LOAD ...
Ca passe pour des paquets de 100 000 lignes
J'aimerai donc faire des QVD représentant par exemples des paquets de 100 000 lignes pour hacher mon XML en x QVD.
Avez-vous une idée sur la manière de faire?
Merci d'avance pour vos suggestions,
Julien
tu peux eventuellement charger tout ca dans une table temporaire
T1:
load ... from ...
puis boucler pour stocker par période
select Periode as Boucle resident T1;
let vNoPer=fieldvaluecount(Periode);
for i=1 to vNoPer
let vPer = fieldvalue('Boucle',i)
t2 :
load ... resident T1;
Store T2 into ...
next;
en esperant que ca puisse t'aider
Salut Julien,
Existe-t-il un champ qui puisse servir d'incrément?
La commande FIRST ne saurait pas être utile dans une itération, puisqu'elle ne prend que les premiers records.
Une piste:
1 - Evalue les combinaisons VersionName, PeriodName
LOAD
VersionName, PeriodName
FROM tasource;
Si les lignes sont bien distribuées, alors passe à l'étape suivante
2- Effectue un load distinct des valeurs
Map_Temp:
LOAD DISTINCT
VersionName, PeriodName
FROM tasource;
3-Itère sur ces valeurs
EDIT: Betise, j'ai oublié le where clause
FOR Each vVersion in FieldValueList ('VersionName')
FOR Each vPeriod in FieldValueList ('PeriodName')
'T_$(vVersion)_$(vPeriod)':
LOAD *
FROM tasource
WHERE VersionName = $(vVersion) and PeriodName = $(vPeriod);
STORE 'T_$(vVersion)_$(vPeriod)' into [l'endroitdetonchoix\T_$(vVersion)_$(vPeriod).qvd];
DROP TABLE 'T_$(vVersion)_$(vPeriod)';
NEXT vPeriod
NEXT vVersion
Si les lignes ne sont pas bien distribuées, alors il faudrait créer en amont un index de cononne qui puisse te permettre l'itération.
Bonne chance,
Antoine
merci pour l'idée. je n'ai dans le XML qu'une seule période et une seule version mais je vais donc m'inspirer de ta boucle pour découper selon un autre champ. tout dépend de la distribution des données
aucune indexation dans le XML. je vais en effet partir une une boucle sur un champ autre que version ou période car mon XML est un extract déjà de 1 version et 1 période
si c'est effectivement une seule version et 1 seule période , tu aussi ajouter dans le load le RowNo puis ensuite faire des tranches homogènes de XXXXXXX lignes
bons tests