Dan*_*nny 9 php performance loops
我想知道是否有人可以解决这个问题.. PHP 5.3.0 :)
我有一个循环,它抓取CSV文件的内容(大,200mb),处理数据,为mysql插入构建一堆变量,一旦循环完成并创建变量,我就插入信息.
首先,mysql插件运行完美,没有延迟,一切都很好,但是LOOP本身有延迟,我最初使用fgetcsv()读取CSV文件,但与file_get_contents()相比,这有严重的延迟 - 所以我切换到file_get_contents().循环将在几秒钟内执行,直到我尝试添加一个函数(我还在循环内添加了表达式而没有函数来查看它是否有帮助)来创建一个包含每行的CSV数据的数组,这个是什么导致解析时间严重延迟!(基于这个200mb文件的差异大约是30秒,但是根据我猜的csv文件的文件大小)
这是一些代码,所以你可以看到我在做什么:
$filename = "file.csv";
$content = file_get_contents($filename);
$rows = explode("\n", $content);
foreach ($rows as $data) {
$data = preg_replace("/^\"(.*)\"$/","$1",preg_split("/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/", trim($data))); //THIS IS THE CULPRIT CAUSING SLOW LOADING?!?
}
Run Code Online (Sandbox Code Playgroud)
运行上面的循环,几乎可以在没有线的情况下立即执行:
$data = preg_replace("/^\"(.*)\"$/","$1",preg_split("/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/", trim($data)));
Run Code Online (Sandbox Code Playgroud)
我也试过创建一个函数如下(循环外):
function csv_string_to_array($str) {
$expr="/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/";
$results=preg_split($expr,trim($str));
return preg_replace("/^\"(.*)\"$/","$1",$results);
}
Run Code Online (Sandbox Code Playgroud)
并调用函数而不是一个衬垫:
$data = csv_string_to_array($data);
Run Code Online (Sandbox Code Playgroud)
再次没有运气:(
任何帮助都会受到赞赏,我猜测fgetcsv函数基于它引起的延迟以非常类似的方式执行,循环并从数据行创建数组.
丹尼
小智 0
我部分找到了一个解决方案,我发送一个批处理,一次仅循环 1000 行(php 循环 1000 行,直到到达文件末尾)。
然后我只设置:
$data = preg_replace("/^\"(.*)\"$/","$1",preg_split("/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/", trim($data)));
Run Code Online (Sandbox Code Playgroud)
在 1000 行上,这样就不会为导致问题的整个文件设置它。
现在它正在循环并在 1-2 秒内将 1000 行插入到 mysql 数据库中,我对此感到满意。我已经将脚本设置为循环 1000 行,记住它的最后位置,然后循环到下 1000 行,直到到达末尾,它似乎工作正常!