我将文件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);
行
为什么呢?如何解决这个错误?
答案 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
答案 1 :(得分:-1)
尝试添加:
ini_set('memory_limit', '700M');