2

我将文件 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);

我已通过 add 修复 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);

为什么?如何修复该错误?

4

2 回答 2

1

根据文档

pg_escape_bytea() 为 bytea 数据类型转义字符串。它返回转义字符串。

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

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

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

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

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

  • 使用fread读取 20MB 的文件(而不是 file_get_contents)
  • 使用 *pg_escape_bytea* 处理 20MB(总共 100MB)
  • 重复该过程,直到文件被完全处理
于 2013-01-18T07:19:38.967 回答
-1

尝试添加:

ini_set('memory_limit', '700M');
于 2013-01-18T07:12:46.363 回答