php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #33249 GMP functions didn't free memory
Submitted: 2005-06-05 18:15 UTC Modified: 2005-06-07 23:31 UTC
From: s dot araya at numisys dot com dot ar Assigned:
Status: Not a bug Package: Math related
PHP Version: 5.0.3 OS: Linux (Gentoo)
Private report: No CVE-ID: None
 [2005-06-05 18:15 UTC] s dot araya at numisys dot com dot ar
Description:
------------
Hello, 


  I'm using gmp library to perform a function which uses a few operations with large integer values. My script runs in console mode (at least four hours of processing), scanning a big mysql table and invoking the function to calculate big integer values that are stored in the table. 


  But, in case the table has a lot of rows to process, the script halt with 'out of memory' error. Studying the problem I realized that GMP functions didn't free memory (when I issue unset( <resource> ) ) and continue allocate memory in every function pass. There is no gmp_free() in php manual. 


  Is there any workaround to avoid the problem? 


  Thank you, 


Sebasti?n Araya 
Numisys S.A. 


Reproduce code:
---------------
for( $i = 0; $i = 1000000; $i++)
   store_calc_value( $i );

function store_calc_value( $v )
{
  $a = gmp_mul( $v, "0x100000000" );
  $b = gmp_mul( $a, "0x1000" );

  $sql = "Insert into t (big, value) Values (";
  $sql.= gmp_strval( $a ) . ", " . gmp_strval( $b ) . ")";

  mysql_query( $sql );

  unset( $a ); // gmp_free( $a );
  unset( $b ); // gmp_free( $b );

}

Expected result:
----------------
I expect that memory has to be freed once returning from function store_calc_value(). A simple top command in another Linux session, tell me that php resource continue to grow.


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2005-06-06 00:00 UTC] sniper@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

You can achieve similar thing with any other variable, it's not GMP related at all.

 [2005-06-06 06:10 UTC] s dot araya at numisys dot com dot ar
> You can achieve similar thing with any other variable, 
> it's not GMP related at all.

Due to the short answer I recieved, I can't understand what're you telling me... I use GMP functions 'cos I need to make more calculations that I've exposed on the example, which I can't achieve in 32 bits operations.

I see that when I issue mysql_query( 'Select * from Table1 limit 0, 1000') I need to call mysql_free_result() to free memory used to store the result in memory. 

Consequently, with GMP functions which uses ZEND_REGISTER_RESOURCE macro in gmp.c (wrapper for GMP functions), I suppouse that the resource continue alloc'd, till a free() call releases it, according with system memory test (experienced with a simple ?top? in Linux).
 [2005-06-07 13:43 UTC] s dot araya at numisys dot com dot ar
Also trying with: 

unset( <variable> );
<variable> = Null;

didn't free memory neither call the garbage collector, and in every function pass I've got an increment near to 1 MB of alloc'd RAM.
 [2005-06-07 23:31 UTC] sniper@php.net
Perhaps this explains the problem at hand:
http://www.swox.com/gmp/manual/Memory-Management.html

I tested for fun if a gmp_free() would make a difference.
And guess what? It has absolutely NO effect during runtime on the memory consumption. So this is still no bug (in PHP).

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 14:01:32 2024 UTC