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