Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z pamięcią
Forum PHP.pl > Forum > Przedszkole
shinuexx
Mam problem z alokacją danych w pamięci. Jestem w trakcie pisania skryptu do otwierania plików Matlaba *.mat i wyskakuje mi błąd:
Kod
Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in D:\Program Files (x86)\Zend\Apache2\htdocs\homepage\mat2.php on line 146

Zupełnie nie widzę błędu w skrypcie w tym miejscu, ale na wszelki wypadek dodam także kod:
  1. <?php
  2.  
  3. /**
  4.  * @author ShInUeXx
  5.  * @copyright 2011
  6.  * @category MAT-file decrypter
  7.  */
  8. if(!function_exists("str2array")){
  9. function str2array($str){
  10. $l=strlen($str);
  11. $return=array();
  12. for($x=0;$x<$l;$x++)
  13. $return[]=$str[$x];
  14. return $return;
  15. }
  16. }
  17. /****************************************************/
  18. if(!function_exists("array2str")){
  19. function array2str($array){
  20. $ret='';
  21. foreach($array as $v)
  22. $ret.=$v;
  23. return $ret;
  24. }
  25. }
  26. /****************************************************/
  27. // Definiowanie typów Matlab
  28. /****************************************************/
  29. $mdt=array(
  30. 1=>"MI_INT8",
  31. 2=>"MI_UINT8",
  32. 3=>"MI_INT16",
  33. 4=>"MI_UINT16",
  34. 5=>"MI_INT32",
  35. 6=>"MI_UINT32",
  36. 7=>"MI_SINGLE",
  37. 9=>"MI_DOUBLE",
  38. 12=>"MI_INT64",
  39. 13=>"MI_UINT64",
  40. 14=>"MI_MATRIX",
  41. 15=>"MI_COMPRESSED",
  42. 16=>"MI_UTF8",
  43. 17=>"MI_UTF16",
  44. 18=>"MI_UTF32"
  45. );
  46. foreach($mdt as $k=>$v)
  47. define($v,$k);
  48. ///////////////////////////////////////////////////////
  49. $matlab_data_type=array(
  50. "null",
  51. array("id"=>1,"symbol"=>"miINT8","type"=>"8 bit, signed"),
  52. array("id"=>2,"symbol"=>"miUINT8","type"=>"8 bit, unsigned"),
  53. array("id"=>3,"symbol"=>"miINT16","type"=>"16-bit, signed"),
  54. array("id"=>4,"symbol"=>"miUINT16","type"=>"16-bit, unsigned"),
  55. array("id"=>5,"symbol"=>"miINT32","type"=>"32-bit, signed"),
  56. array("id"=>6,"symbol"=>"miUINT32","type"=>"32-bit, unsigned"),
  57. array("id"=>7,"symbol"=>"miSINGLE","type"=>"IEEEŸ 754 single format"),
  58. array("id"=>8,"symbol"=>"--","type"=>"Reserved"),
  59. array("id"=>9,"symbol"=>"miDOUBLE","type"=>"IEEE 754 double format"),
  60. array("id"=>10,"symbol"=>"--","type"=>"Reserved"),
  61. array("id"=>11,"symbol"=>"--","type"=>"Reserved"),
  62. array("id"=>12,"symbol"=>"miINT64","type"=>"64-bit, signed"),
  63. array("id"=>13,"symbol"=>"miUINT64","type"=>"64-bit, unsigned"),
  64. array("id"=>14,"symbol"=>"miMATRIX","type"=>"MATLAB array"),
  65. array("id"=>15,"symbol"=>"miCOMPRESSED","type"=>"Compressed Data"),
  66. array("id"=>16,"symbol"=>"miUTF8","type"=>"Unicode UTF-8 Encoded Character Data"),
  67. array("id"=>17,"symbol"=>"miUTF16","type"=>"Unicode UTF-16 Encoded Character Data"),
  68. array("id"=>18,"symbol"=>"miUTF32","type"=>"Unicode UTF-32 Encoded Character Data")
  69. );
  70. ////////////////////////////////////////////////////////
  71. function var_analyzer(&$data){
  72. switch($data['type']['id']){
  73. case MI_INT8:
  74. @$data['decrypted']=current(unpack("c",$data['data']));
  75. break;
  76. case MI_UINT8:
  77. @$data['decrypted']=current(unpack("C",$data['data']));
  78. break;
  79. case MI_INT16:
  80. @$data['decrypted']=current(unpack("s",$data['data']));
  81. break;
  82. case MI_UINT16:
  83. @$data['decrypted']=current(unpack("v",$data['data']));
  84. break;
  85. case MI_INT32:
  86. @$data['decrypted']=current(unpack("I",$data['data']));
  87. break;
  88. case MI_UINT32:
  89. @$data['decrypted']=current(unpack("V",$data['data']));
  90. break;
  91. case MI_SINGLE:
  92. @$data['decrypted']=current(unpack("f",$data['data']));
  93. break;
  94. case MI_DOUBLE:
  95. @$data['decrypted']=current(unpack("d",$data['data']));
  96. break;
  97. case MI_INT64:
  98. $dat=str2array($data['data']);
  99. $d='';
  100. foreach($dat as $v){
  101. $d.=str_pad(decbin(ord($v)),8,"0",STR_PAD_LEFT);
  102. }
  103. $data['decrypted']=bcadd(base_convert($d,2,10),bcmul(-1,"18446744073709552056"));
  104. break;
  105. case MI_UINT64:
  106. $dat=str2array($data['data']);
  107. $d='';
  108. foreach($dat as $v){
  109. $d.=str_pad(decbin(ord($v)),8,"0",STR_PAD_LEFT);
  110. }
  111. $data['decrypted']=base_convert($d,2,10);
  112. break;
  113. case MI_MATRIX:
  114.  
  115. break;
  116. case MI_COMPRESSED:
  117. $data['decompression']=gzuncompress($data['data']);
  118. $data['decrypted']=var_reader($data['decompression']);
  119. var_analyzer($data['decrypted']);
  120. break;
  121. case MI_UTF8:
  122. $data['decrypted']=$data['data'];
  123. break;
  124. case MI_UTF16:
  125. $data['decrypted']=iconv("UTF-16","UTF-8",$data['data']);
  126. break;
  127. case MI_UTF32:
  128. $data['decrypted']=iconv("UTF-32","UTF-8",$data['data']);
  129. break;
  130.  
  131. default:
  132. break;
  133. }
  134. }
  135. ////////////////////////////////////////////////////////
  136. function var_reader($str){
  137. global $matlab_data_type;
  138. $tmp=current(unpack("v",substr($str,2,2)));
  139. if($tmp!=0){
  140. $data['type']=$matlab_data_type[$tmp];
  141. $data['size']=current(unpack("v",substr($str,0,2)));
  142. $data['sdf']=true;
  143. $data['data']=substr($str,4,$data['size']);
  144. }
  145. else {
  146. $data['type']=current(unpack("V",substr($str,0,4)));
  147. $data['size']=current(unpack("V",substr($str,4,4)));
  148. $data['sdf']=false;
  149. $data['data']=substr($str,8,$data['size']);
  150. }
  151. return $data;
  152. }
  153. ////////////////////////////////////////////////////////
  154. function mat_header($str){
  155. $header['desc']=substr($str,0,116);
  156. $sdo=substr($str,116,8);
  157. $sdo=str2array($sdo);
  158. $tmp=array();
  159. foreach($sdo as $v)
  160. $tmp[]=dechex(ord($v));
  161. $header['subsys_data_offset']="0x".array2str($tmp);
  162. unset($tmp,$sdo);
  163. $header['version']=current(unpack("v",substr($str,124,2)));
  164. $header['endian_indicator']=substr($str,126,2);
  165. return $header;
  166. }
  167. ////////////////////////////////////////////////////////
  168. $f=fopen($file,"r");
  169. $header=fread($f,128);
  170. $vars=fread($f,filesize($file));
  171. fclose($f);
  172. $mat['header']=mat_header($header);
  173. unset($header);
  174. for($x=0;strlen($vars)>0;$x++){
  175. $data=var_reader($vars);
  176. $mat['datas'][$x]=$data;
  177. }
  178.  
  179. ?>

Dlaczego ten błąd mi się pojawia, oraz jak mogę go rozwiązaćquestionmark.gif
Crozin
A plik .MAT sam w sobie ma jaki rozmiar?
Korab
Możesz zwiększyć memory_limit w php.ini.
shinuexx
*.mat ma raptem 2k więc to raczej nie to.
cykcykacz
Może spróbuj dodać na początku skryptu:
  1. ini_set("memory_limit","24M");
everth
Linia 174. Może jestem już zmęczony ale tam chyba jest pętla nieskończona.
shinuexx
A widzisz. Zapomniałem pomniejszać tekst to przetworzenia;P i dlatego mi przepełniało pamięć;P dzięki wielkie. Nie zauważyłem tego. Teraz muszę tylko dopracować wyciąganie listy zmiennych.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.