On 08/10/12 13:46, Pierre-Alain Blanc wrote:


Hello,

I've had a problem when using 'execute_array' to insert (lots of)
records with DBD::Oracle (version 1.50): the script consumed too much
memory and finally crashed (killed by kernel). I tried to trigger the
garbage-collection with some code rewrite but it didn't help. But if
I told Oracle *not* to use an UTF-8 charset (changing NLS_LANG from
(for example) "german_germany.utf8" to "german_germany.we8dec"), the
problem disappeared.

After some investigations, I think the leak is in
'ora_st_execute_array' method of dbdimp.c. Please find the patch as
attachment. As I'm completly new to writing C for Perl, it may be
something I did not understand or did not correctly fixed. Sorry if
it would be the case.

Thanks & best regards, Pierre-Alain Blanc



Thanks for looking into this. The patch:

Index: dbdimp.c
===================================================================
--- dbdimp.c    (revision 15435)
+++ dbdimp.c    (working copy)
@@ -3839,6 +3839,7 @@
        }
        Safefree(phs);
        Safefree(utf8_flgs);
+       SvREFCNT_dec(tuples_utf8_av);
        /* Store array of bind typles, for use in OCIBindDynamic() callback. */
        imp_sth->bind_tuples = tuples_av;
        imp_sth->rowwise = (columns_av == NULL);

looks good but it does not explain how changing chrset made the problem go 
away. Perhaps you could give me a better idea of what you were doing then I can 
replicate and test it.

Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com

Reply via email to