php - 这段代码需要循环超过 350 万行,我怎样才能让它更有效率?

标签 php mysql optimization

我有一个 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/

相关文章:

php - 如何在一个表单中插入4个文件上传

php - 用 PHP 编写的语言解析器库

php - 在php中从mysql获取特定列数据的最简单方法(特殊情况)

php - 在 PHP/MySQL 中存储大量表单数据的最佳方式?

php - 如果用户没有启用 javascript,则使用 javascript 隐藏输入 - 无论如何要阻止它在页面加载时快速闪烁?

php - 如何使用MySQL中的关系将一个表从另一个数据库插入到另一个表?

php - 将使用路径更新列的触发器

python : How to optimize comparison between two large sets?

c++ - 我需要做什么才能获得在编译器优化代码中调用的函数?

c++ - 为什么这个循环没有向量化?