|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : octobre 2010 Messages : 10 ![]() |
Bonjour,
J'utilise ORACLE 11, j'ai une procédure stockée qui écrit dans un fichier. A l'heure actuelle, j'écris en utilisant UTL_FILE.PUT_LINE avec un buffer de 32k (qui est le max autorisé). J'ai beaucoup de volume à écrire (dans les 50 mo). Y-a-t-il un moyen d'écrire avec un plus gros buffer en utilisant autre chose que UTL_FILE.PUT_LINE ? Ou connaissez vous d'autre moyen d'optimiser l'écriture sur fichier en PLSQL ? Merci pour vos réponses Jacques |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
D'abord ça dépend de votre algorithme, est-il optimisé ?
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : octobre 2010 Messages : 10 ![]() |
J'ai une procédure principale de parcours d'une table et une sous procédure qui écrit par bloc de 32k.
En terme d'optimisation, pour l'instant je fais en sorte de faire une seule ouverture / fermeture de fichier et de passer le même pointeur pour tous les appels de la sous procédure d'écriture. Je fais aussi en sorte de remplir le plus possible mon buffer avant de le flusher dans le fichier disque (c'est du xml je fais aussi en sorte de pas couper la ligne à l'intérieur d'une balise). La sous procédure d'écriture est donc appelée environs 1600 fois pour un fichier de 50mo. C'est l'option "petit buffer, beaucoup d'appel à la sous procédure". Ca m'a pu plus performant que de tout charger dans une variable clob et de faire un seul appel à une procédure d'écriture qui elle découperait le clob par bloc de 32k et ferait ses écritures, option "gros buffer, 1 seul appel à la sous procédure". Mais j'avoue de ne pas être vraiment sûr que ce soit plus performant, peut-être qu'une solution intermédiaire sera à étudier, vos avis ? |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Si chaque appel de la procédure UTL_FILE.PUT se fait avec un buffer rempli de 32K c’est OK.
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 437 ![]() |
Comment est géré le buffer de 32K dans la procédure : Un clob ?
J'ai réduit un traitement de 1h à 5mn en changeant des || du clob par des affectations dans un varchar et en || au clob une seule fois à la fin de chaque petit traitement.
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : octobre 2010 Messages : 10 ![]() |
J'ai améliorer mes perfs en utilisant notamment une fonction qui écrit d'un coup le contenu d'un clob dans un fichier.
cf http://www.oracle-developer.net/display.php?id=425 |
|
|
00
|
|
|
#7 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : octobre 2010 Messages : 10 ![]() |
J'ai pas vraiment pris le temps de benchmarker la solution clobtofile versus utl_file et ayant fait d'autres modifs dans le processus d'écriture, je peux pas être sûr à 100% que ce soit dû seulement au changement de méthode. Mais les perfs se sont améliorées de manière significatives et le gain en I/O me semble vraiment valoir la chandelle.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com