|
|
|
PHP import to MYSQL ช้ามากเลยค่ะ รบกวนช่วยดูด้วยค่ะ ข้อมูล เป็นแสน row ค่ะ |
|
|
|
|
|
|
|
อ่านข้อมูลจาก text file แล้ว import ลง mysql ข้อมูลประมาณ 500000 row แต่นานมากเลยค่ะ
Code (PHP)
<?php
$dbhost = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbname = "ops";
$mysqli = new mysqli ($dbhost, $dbusername, $dbpassword, $dbname);
$Filename="bow.oa";
$Qdata = $Filename ;
$assay = file($Qdata) ;
foreach ($assay as $line_num=>$line){
$value = (float)substr($line,20,8);
$col = (float)substr($line,3,3);
$roww= (float)substr($line,9,3);
$Rvalue[]=$value;
$coll[]=$col;
$rowww[]=$roww;
}
foreach($Rvalue as $key=>$value){
$VV = $Rvalue[$key];
$CC = $coll[$key];
$RR = $rowww[$key];
$strSQL2 = "INSERT INTO bowl (colmn,roww,value) VALUES ('$CC', '$RR','$VV')";
$objQuery2 = $mysqli->query($strSQL2);
}
echo "Finish";
mysqli_close($mysqli);
?>
ต้องเปลี่ยน code ตรงไหนบ้าง ให้เร็วขึ้นค่ะ
Tag : PHP
|
|
|
|
|
|
Date :
2016-07-12 18:13:46 |
By :
sammam |
View :
1844 |
Reply :
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองดูนะครับ ติด loop ทิ้งไป loop นึง แล้ว รัน query insert เพียงครั้งเดียว แบบ multi row
**ไม่ได้เทสนะครับ
Code (PHP)
<?php
$dbhost = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbname = "ops";
$mysqli = new mysqli ($dbhost, $dbusername, $dbpassword, $dbname);
$Filename="bow.oa";
$Qdata = $Filename ;
$assay = file($Qdata) ;
$values = "";
foreach ($assay as $line_num=>$line){
$value = (float)substr($line,20,8);
$col = (float)substr($line,3,3);
$roww= (float)substr($line,9,3);
$values .= "('$value','$col','$roww'),";
}
$values = rtrim($values, ",");
$strSQL2 = "INSERT INTO bowl (colmn,roww,value) VALUES $values";
$objQuery2 = $mysqli->query($strSQL2);
echo "Finish";
mysqli_close($mysqli);
?>
|
ประวัติการแก้ไข 2016-07-12 19:52:45 2016-07-12 19:53:25
|
|
|
|
Date :
2016-07-12 19:52:06 |
By :
mangkunzo |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
น่าจะเกิด out of memory นะครับ ไม่ค่อยแน่ใจ
ลองดูตามลิ้งนะครับ มีวิธีแก้
mysql-server-has-gone-away
|
|
|
|
|
Date :
2016-07-13 00:01:15 |
By :
mangkunzo |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
บางทีโค๊ดเก่าก็ดีอยู่แล้ว
เพียงแต่ต้องตัด index ต่างๆ ออกก่อน เมื่อทำเสร็จแล้ว ค่อยใส่ index เข้าไปใหม่
ถ้ามี index ทุกครั้งที่ insert จะมีการจัดเรียงเสมอ
เอาแค่ ใส่ๆๆๆๆๆ โดยไม่ต้องจัดเรียง แล้วไปเรียงทีเดียวเมื่อเสร็จ
ตอนเรียงอาจจะนานซักหน่อย แต่ก็น่าจะเร็วกว่า
และมันทำงานเป็น resident บนฝั่ง server
โค๊ดข้างล่างเป็นการเปลี่ยนจากการอ่านทั้งหมดเก็บไว้ใน array เป็นการอ่าน เฉพาะบางส่วนนำมาใช้งาน
ป้องกันหน่วยความจำเต็ม
Code (PHP)
<?php
$db_link = new mysqli('','','','');
$filename = "data.txt";
$handle = fopen($filename, "r"); $content = '';
while(!feof($handle)){
$contents .= fread($handle, 2000);
$ar=explode("\n",$contents); $end_ln=count($ar)-1;
foreach($ar as $k=>$line_data){
if($k<$end_ln){ // ตรวจสอบว่าไม่เป็น element สุดท้าย
// $line_data = ข้อมูลแต่ละบันทัด เรียกใช้ ฟังก์ชั่น ตรงนี้
call_insert_data();
//////////////////////////////
}else{
// ไม่ทำงานกับ element สุดท้าย เพราะข้อมูลอาจไม่ครบ ไห้ทดไปรวมกับ การอ่านไฟล์ ครั้งต่อไป
$content = $line_data;
}
}
}
if(strlen($content)>10){
// ข้อมูล บันทัดสุดท้ายที่ทดมา ทำตรงนี้
call_insert_data($content);
}
function call_insert_data($data){
// ทำงานส่่วนบันทุกข้อมูล
global $db_link;
// แปลงข้อมูลให้อยู่ในรูปที่ต้องการ
$db_link->query( 'insert ....' );
}
|
ประวัติการแก้ไข 2016-07-13 10:36:03 2016-07-13 16:20:59
|
|
|
|
Date :
2016-07-13 08:50:19 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าข้อมูลเยอะขนาดนี้ Optimize Code ก็ช่วยได้นิดหน่อย
ตัวแปรไหนใช้แค่ครั้งเดียว อย่าตั้งเป็นตัวแปร เปลืองหน่วยความจำ
single quote '' กับ double quote ""
ให้ใช้ single quote เพราะ single quote จะนำไปใช้ได้เลย
ส่วน double quote จะตรวจสอบทุกครั้งว่ามีตัวแปรอยู่ข้างในหรือไม่
echo ทำงานได้เร็วกว่า print
และอื่นๆ อีกมากมาก ลองไปอ่าน php optimization code
Code (PHP)
<?php
$mysqli = new mysqli ('localhost', 'root', '', 'ops');
$Qdata = 'bow.oa';
$assay = file($Qdata) ;
foreach ($assay as $line_num => $line) {
$mysqli->query("INSERT INTO bowl (colmn, roww, value) VALUES ('".(float)substr($line,20,8)."', '".(float)substr($line,3,3)."', '".(float)substr($line,9,3)."')");
}
echo 'Finish';
$mysqli->close();
?>
|
|
|
|
|
Date :
2016-07-13 08:52:28 |
By :
fossil31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 04
|