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

PHP致命错误:允许的xxx字节内存大小已用尽(尝试分配XX字节),php,postgresql,Php,Postgresql,我有一个php脚本,可以拆分一个大文件并插入PostgreSQL。此导入以前在PHP5.3、PostgreSQL 8.3和Mac OS X 10.5.8上都可以使用。我现在把一切都转移到了一个新的Mac Pro上。它有大量的RAM(16MB)、MacOSX10.9.2、PHP5.5.8和PostgreSQL9.3 问题在于读取大型导入文件时。它是一个标签分隔的文件,超过181MB。我试图将PHP内存增加到2GB,但没有成功。所以我想问题一定出在读取文本文件并拆分它的代码中。我得到这个错误: PH

我有一个php脚本,可以拆分一个大文件并插入PostgreSQL。此导入以前在PHP5.3、PostgreSQL 8.3和Mac OS X 10.5.8上都可以使用。我现在把一切都转移到了一个新的Mac Pro上。它有大量的RAM(16MB)、MacOSX10.9.2、PHP5.5.8和PostgreSQL9.3

问题在于读取大型导入文件时。它是一个标签分隔的文件,超过181MB。我试图将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);
");

我认为问题在于您使用的是file()函数,它一次读取内存中的整个文件。试着用fopen和fgets逐行阅读

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

您还可以使用COPY命令()直接导入文件。

我认为问题在于您使用的是file()函数,它一次读取内存中的整个文件。试着用fopen和fgets逐行阅读

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

您还可以使用COPY命令()直接导入文件。

我认为问题在于您使用的是file()函数,它一次读取内存中的整个文件。试着用fopen和fgets逐行阅读

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

您还可以使用COPY命令()直接导入文件。

我认为问题在于您使用的是file()函数,它一次读取内存中的整个文件。试着用fopen和fgets逐行阅读

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

您还可以使用COPY命令()直接导入文件。这种情况可能发生在代码中,例如无限循环、处理大量数据,甚至数据库查询
您应该检查代码,可能存在无限循环或此类情况

这种情况可能发生在代码中,例如无限循环、处理大量数据,甚至数据库查询
您应该检查代码,可能存在无限循环或此类情况

这种情况可能发生在代码中,例如无限循环、处理大量数据,甚至数据库查询
您应该检查代码,可能存在无限循环或此类情况

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

谢谢Georg的帮助!我肯定是在看复制命令。我尝试导出数据库(近30万条记录),与我的解决方案相比,使用COPY命令导出和导入的速度非常快。我只得到一个错误:上一个预期的列错误之后有额外的数据,所以我想我必须查看导入的数据,以及它是否完全对应于字段。但这是很好的帮助这么长时间!谢谢,谢谢乔治的帮助!我肯定是在看复制命令。我尝试导出数据库(近30万条记录),与我的解决方案相比,使用COPY命令导出和导入的速度非常快。我只得到一个错误:上一个预期的列错误之后有额外的数据,所以我想我必须查看导入的数据,以及它是否完全对应于字段。但这是很好的帮助这么长时间!谢谢,谢谢乔治的帮助!我肯定是在看复制命令。我尝试导出数据库(近30万条记录),与我的解决方案相比,使用COPY命令导出和导入的速度非常快。我只得到一个错误:上一个预期的列错误之后有额外的数据,所以我想我必须查看导入的数据,以及它是否完全对应于字段。但这是很好的帮助这么长时间!谢谢,谢谢乔治的帮助!我肯定是在看复制命令。我尝试导出数据库(近30万条记录),与我的解决方案相比,使用COPY命令导出和导入的速度非常快。我只得到一个错误:上一个预期的列错误之后有额外的数据,所以我想我必须查看导入的数据,以及它是否完全对应于字段。但这是很好的帮助这么长时间!谢谢