我编写了这段代码,允许读取文件夹,根据文件名插入到不同的表中的 csv 文件的数据。文件处理完毕后,将被移动到另一个文件夹。我的代码运行良好,但第二个 csv 文件长度超过 80 000 行,需要几个小时才能集成到我的数据库中。如何提高代码的性能?我尝试“加载本地数据”但没有成功......<?phpinclude("../connexion.php");ini_set('max_execution_time', 54000);$timestamp= date("y-m-d H:i");$dir = 'D:/xampp/htdocs/retail_BI/test/';$allFiles = scandir($dir);$dest = 'D:/xampp/htdocs/retail_BI/test/files/'; foreach($allFiles as $file) { if (!in_array($file,array(".",".."))) { $file = $dir.$file; $filename = basename( $file ); if ( strpos( $filename, 'BI1_' ) === 0 ) { if (($handle = fopen("$filename", "r")) !== false) { //To remove BOM in the fist cell fseek($handle, 3); while (($data = fgetcsv($handle, 9000000, ";")) !== false) { if (empty(array_filter($data))) { echo "not good"; continue; } $date = DateTime::createFromFormat('d/m/Y H:i:s A', $data[2]); if ($date === false) { break; } $date1 = $date->format('Y-m-d'); // 2020-07-07 $date2 = $date->format('Hi A'); // 1247 AM //database entry $query = "insert into dbo.Y2_Sales (storenumber, storename, date, time, TransRef, stylecode, color, size, quantity, unit_price, SalesExGST, cost, currency) values('$data[0]', '$data[1]','$date1','$date2','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]', '$data[8]','$data[9]','$data[10]','$data[11]')"; $stmt = $conn->query( $query ); if (!$stmt) { echo $conn->error;} } }
1 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
不要将每一行的数据插入数据库,而是尝试批量插入。
您始终可以进行批量插入,可以获取 n(使用 1000)个条目并将其插入到表中。
这将减少数据库调用,从而减少总时间。
对于 80k 条目,您也有可能超出内存限制。
您可以使用 php 中的生成器来克服这个问题。
虽然这是在 Laravel 中,但是从 csv 读取的代码是独立的(使用生成器的代码),并且可以在此处使用逻辑。
- 1 回答
- 0 关注
- 119 浏览
添加回答
举报
0/150
提交
取消