我有一个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;
答案 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)
这种情况可以从代码中发生,例如无限循环,处理大量数据,甚至是数据库查询 你应该检查代码,可能有无限循环或这种类型的情况