如何修复致命错误:在PHP中内存不足(已分配)(尝试分配字节)

时间:2013-01-18 07:08:43

标签: php

我将文件csv的值读取为:

 //$mypath . '/' . $filename <=> ../abc.csv
 $val = file_get_contents($mypath . '/' . $filename);                                       

 $escaped = pg_escape_bytea($val);

 $model->addFileImport($tmp, $data['email'], $escaped);

我的档案大约100MB。 在php.ini设置中: memory_limit = 128M

但它仍会在行:Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 133120 bytes) in...

显示错误$val = file_get_contents($mypath . '/' . $filename);

我已修复添加ini_set('memory_limit', '-1');

 //$mypath . '/' . $filename <=> ../abc.csv
 ini_set('memory_limit', '-1');
 $val = file_get_contents($mypath . '/' . $filename);                                       

 $escaped = pg_escape_bytea($val);

 $model->addFileImport($tmp, $data['email'], $escaped);

但它显示错误:

  

致命错误:第112行的C:\ wamp \ www \ joomlandk \ components \ com_servicemanager \ views \ i0701 \ view.html.php内存不足(分配230686720)(试图分配657099991字节)

在第$escaped = pg_escape_bytea($val);

为什么呢?如何解决这个错误?

2 个答案:

答案 0 :(得分:1)

根据the doc

  

pg_escape_bytea()转义bytea数据类型的字符串。它回来了   转义字符串。

     

当您选择bytea类型时,PostgreSQL会返回八进制字节值   以'\'为前缀(例如 \ 032 )。用户应该转换回   手动二进制格式。

意味着单个输入字节给出4个字节,即初始大小的4倍

你需要大量的RAM来处理你的文件(也许你的系统不能分配那么多内存 - 即使没有PHP限制)。解决方案是从40MB块处理它,例如使用fread()fwrite()函数。

  $val = file_get_contents($mypath . '/' . $filename);

将占用100MB - 因此下一行需要400 MB,总计500MB。您需要从* file_get_contents *中读取更少,例如一次只读取20(或40)MB

  • 使用 fread (而不是file_get_contents)读取20MB的文件
  • 使用* pg_escape_bytea *(总计100MB)处理20MB
  • 重复此过程,直到文件完全处理

答案 1 :(得分:-1)

尝试添加:

ini_set('memory_limit', '700M');