我有一个 csv 文件,里面有 350 万个代码。
我应该指出,这永远只会是这一次。
csv 看起来像
age9tlg,
rigfh34,
...
这是我的代码:
ini_set('max_execution_time', 600);
ini_set("memory_limit", "512M");
$file_handle = fopen("Weekly.csv", "r");
while (!feof($file_handle)) {
$line_of_text = fgetcsv($file_handle);
if (is_array($line_of_text))
foreach ($line_of_text as $col) {
if (!empty($col)) {
mysql_query("insert into `action_6_weekly` Values('$col', '')") or die(mysql_error());
}
} else {
if (!empty($line_of_text)) {
mysql_query("insert into `action_6_weekly` Values('$line_of_text', '')") or die(mysql_error());
}
}
}
fclose($file_handle);
这段代码会在我身上中途消失吗? 我的内存和最大执行时间是否足够长?
注意: 此代码将在我的本地主机上运行,并且数据库在同一台 PC 上,因此延迟不是问题。
更新:
这是另一种可能的实现。 这个是批量插入 2000 条记录
$file_handle = fopen("Weekly.csv", "r");
$i = 0;
$vals = array();
while (!feof($file_handle)) {
$line_of_text = fgetcsv($file_handle);
if (is_array($line_of_text))
foreach ($line_of_text as $col) {
if (!empty($col)) {
if ($i < 2000) {
$vals[] = "('$col', '')";
$i++;
} else {
$vals = implode(', ', $vals);
mysql_query("insert into `action_6_weekly` Values $vals") or die(mysql_error());
$vals = array();
$i = 0;
}
}
} else {
if (!empty($line_of_text)) {
if ($i < 2000) {
$vals[] = "('$line_of_text', '')";
$i++;
} else {
$vals = implode(', ', $vals);
mysql_query("insert into `action_6_weekly` Values $vals") or die(mysql_error());
$vals = array();
$i = 0;
}
}
}
}
fclose($file_handle);
如果我要使用此方法,我可以将其设置为立即插入的最高值是多少?
更新 2
所以,我发现我可以使用
LOAD DATA LOCAL INFILE 'C:\\xampp\\htdocs\\weekly.csv' INTO TABLE `action_6_weekly` FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY ','(`code`)
但现在的问题是,我对 csv 格式的理解是错误的,
它实际上是4个代码,然后是一个换行符,
所以
fhroflg、qporlfg、vcalpfx、rplfigc、
vapworf,flofigx,apqoeei,clxosrc,
...
所以我需要能够指定两条终止于
的行
这个问题已经扩展到Here .
更新 3
使用 将其设置为批量插入 20k 行
while (!feof($file_handle)) {
$val[] = fgetcsv($file_handle);
$i++;
if($i == 20000) {
//do insert
//set $i = 0;
//$val = array();
}
}
//do insert(for last few rows that dont reach 20k
但由于某种原因 $val 包含 75,000 行,它在这一点上死了,为什么?
注意上面的代码是简化的。
最佳答案
我怀疑这会是流行的答案,但我会让您的 php 应用程序运行 mysqlimport在 csv 文件上。当然,它的优化远远超出了您将在 php 中执行的操作。
关于php - 这段代码需要循环超过 350 万行,我怎样才能让它更有效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3402521/