PHP致命错误:允许的内存大小xxx字节耗尽(试图分配XX字节)

时间:2014-04-07 09:58:42

标签: php postgresql

我有一个php脚本,可以拆分大文件并插入PostgreSQL。此导入在PHP 5.3和PostgreSQL 8.3以及Mac OS X 10.5.8之前已经有效。我现在把所有东西都搬到了新的Mac Pro上。它有足够的RAM(16MB),Mac OS X 10.9.2,PHP 5.5.8,PostgreSQL 9.3。

问题在于读取大型导入文件。它是一个超过181 MB的制表符分隔文件。我试图将PHP内存增加到 2GB (!),但没有成功。所以我猜问题必须是在读取文本文件并拆分它的代码中。我收到这个错误:

PHP Fatal error:  Allowed memory size of 2097152000 bytes exhausted (tried to allocate 72 bytes) in /Library/FileMaker Server/Data/Scripts/getGBIFdata.php on line 20

有更好的方法吗?我读取文件并分割线条,然后再用\ t(标签)拆分每一行。我在这一行上得到的错误:

$arr = explode("\t", $line);

这是我的代码:

<?php
 ## I have tried everything here, memory_limit in php.ini is 256M
 ini_set("memory_limit","1000M");

$db= pg_connect('host=127.0.0.1 dbname=My_DB_Name user=Username password=Pass');
### SETT ERROR_STATE:
pg_set_error_verbosity($db, PGSQL_ERRORS_VERBOSE);

### Emtpy DB
$result = pg_query("TRUNCATE TABLE My_DB_Name");

$fcontents = file ('///Library/FileMaker\ Server/Data/Documents/EXPORT/export_file.tab');

  for($i=0; $i<sizeof($fcontents); $i++) {
      $line = trim($fcontents[$i]);
      $arr = explode("\t", $line);

      $query = "insert into My_DB_Name(
field1, field2 etc....      )
        values (
'{$arr[0]}','{$arr[1]}','{$arr[2]}','{$arr[3]}', etc........
        )";
      $result = pg_query($query); echo "\n Lines:".$i;
 pg_send_query($db, $query);
 $res1 = pg_get_result($db);
}
## Update geometry column
$sql = pg_query("
update darwincore2 set punkt_geom=
ST_SetSRID(ST_MakePoint(My_DB_Name.longitude, darwincore2.latitude),4326);
");

&GT;

2 个答案:

答案 0 :(得分:3)

我认为问题在于您正在使用file()函数,该函数会立即读取内存中的整个文件。尝试使用fopen和fgets逐行阅读。

$fp = fopen(filename, "r");
while (($line = fgets($fp)) !== false) {
    ... insert $line into the db....
}
fclose($fp);

您还可以使用COPY命令(http://www.postgresql.org/docs/9.2/static/sql-copy.html

直接导入文件

答案 1 :(得分:0)

这种情况可以从代码中发生,例如无限循环,处理大量数据,甚至是数据库查询 你应该检查代码,可能有无限循环或这种类型的情况