我編寫了這段代碼,允許讀取文件夾,根據(jù)文件名插入到不同的表中的 csv 文件的數(shù)據(jù)。文件處理完畢后,將被移動到另一個文件夾。我的代碼運行良好,但第二個 csv 文件長度超過 80 000 行,需要幾個小時才能集成到我的數(shù)據(jù)庫中。如何提高代碼的性能?我嘗試“加載本地數(shù)據(jù)”但沒有成功......<?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條經(jīng)驗 獲得超3個贊
不要將每一行的數(shù)據(jù)插入數(shù)據(jù)庫,而是嘗試批量插入。
您始終可以進行批量插入,可以獲取 n(使用 1000)個條目并將其插入到表中。
這將減少數(shù)據(jù)庫調(diào)用,從而減少總時間。
對于 80k 條目,您也有可能超出內(nèi)存限制。
您可以使用 php 中的生成器來克服這個問題。?
雖然這是在 Laravel 中,但是從 csv 讀取的代碼是獨立的(使用生成器的代碼),并且可以在此處使用邏輯。
- 1 回答
- 0 關注
- 167 瀏覽
添加回答
舉報
0/150
提交
取消