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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: s dot araya at numisys dot com dot ar
New email:
PHP Version: OS:

 

 [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: Mon Sep 16 18:01:30 2024 UTC