Note that there are some explanatory texts on larger screens.

plurals
  1. POfile_get_contents => PHP Fatal error: Allowed memory exhausted
    text
    copied!<p>I have no experience when dealing with large files so I am not sure what to do about this. I have attempted to read several large files using <strong>file_get_contents</strong> ; the task is to clean and munge them using <strong>preg_replace()</strong>.</p> <p>My code runs fine on small files ; however, the large files (40 MB) trigger an Memory exhausted error:</p> <pre><code>PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 41390283 bytes) </code></pre> <p>I was thinking of using <strong>fread()</strong> instead but I am not sure that'll work either. Is there a workaround for this problem?</p> <p>Thanks for your input.</p> <p>This is my code:</p> <pre><code>&lt;?php error_reporting(E_ALL); ##get find() results and remove DOS carriage returns. ##The error is thrown on the next line for large files! $myData = file_get_contents("tmp11"); $newData = str_replace("^M", "", $myData); ##cleanup Model-Manufacturer field. $pattern = '/(Model-Manufacturer:)(\n)(\w+)/i'; $replacement = '$1$3'; $newData = preg_replace($pattern, $replacement, $newData); ##cleanup Test_Version field and create comma delimited layout. $pattern = '/(Test_Version=)(\d).(\d).(\d)(\n+)/'; $replacement = '$1$2.$3.$4 '; $newData = preg_replace($pattern, $replacement, $newData); ##cleanup occasional empty Model-Manufacturer field. $pattern = '/(Test_Version=)(\d).(\d).(\d) (Test_Version=)/'; $replacement = '$1$2.$3.$4 Model-Manufacturer:N/A--$5'; $newData = preg_replace($pattern, $replacement, $newData); ##fix occasional Model-Manufacturer being incorrectly wrapped. $newData = str_replace("--","\n",$newData); ##fix 'Binary file' message when find() utility cannot id file. $pattern = '/(Binary file).*/'; $replacement = ''; $newData = preg_replace($pattern, $replacement, $newData); $newData = removeEmptyLines($newData); ##replace colon with equal sign $newData = str_replace("Model-Manufacturer:","Model-Manufacturer=",$newData); ##file stuff $fh2 = fopen("tmp2","w"); fwrite($fh2, $newData); fclose($fh2); ### Functions. ##Data cleanup function removeEmptyLines($string) { return preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string); } ?&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload