ขอความรู้หน่อยคับ php อ่านค่า text file ขนาดใหญ่ 4 gb ได้ไหมคั
คือ ผม อยากเขียน หน้าเวป อ่านไฟล์ text ขนาด 4 gb เป็นไฟล์ที่เก็บ log คนเข้าใช้งานอินเทอเน็ตครับ
จะเอาข้อมูลแต่ละบรรทัด มา แยกว่า ไอพี นี้ ออกเวปไหน ออกเวลาอะไร
คือผมลองเขียนแล้วมัน error ว่า Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4097 bytes) in C:\AppServ\www\read2.php on line 14
บรรทัดที่ 14 ผม
13. $objOpen = fopen ("foder/syslog_20-02-2013.txt", "r"); /*** folder ***/
14. while ($file = fgets($objOpen,4096))
15. {
16.
17. $arrFile[] = $file;
18.
19. }
ผมลองรันดูแล้ว ในไฟล์อื่นๆที่ขนาดน้อยกว่านี้ สามารถรันได้ครับ อยากทราบวิธีการหรืออาไรก้อได้ที่ทำไห้มันอ่านไฟล์ได้
หรือควรจะเก็บเข้าฐานข้อมูลก่อน แล้วจึงนำข้อมูลนั้นมาประมวลผล อีกทีครับ คือไฟล์มันจะมีทุกวัน วันละ 3 4 gb แล้วต้องทำเป็นเดือนอ่ะครับ
ช่วยชี้แนะทีครับ
จะเอาข้อมูลแต่ละบรรทัด มา แยกว่า ไอพี นี้ ออกเวปไหน ออกเวลาอะไร
คือผมลองเขียนแล้วมัน error ว่า Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4097 bytes) in C:\AppServ\www\read2.php on line 14
บรรทัดที่ 14 ผม
13. $objOpen = fopen ("foder/syslog_20-02-2013.txt", "r"); /*** folder ***/
14. while ($file = fgets($objOpen,4096))
15. {
16.
17. $arrFile[] = $file;
18.
19. }
ผมลองรันดูแล้ว ในไฟล์อื่นๆที่ขนาดน้อยกว่านี้ สามารถรันได้ครับ อยากทราบวิธีการหรืออาไรก้อได้ที่ทำไห้มันอ่านไฟล์ได้
หรือควรจะเก็บเข้าฐานข้อมูลก่อน แล้วจึงนำข้อมูลนั้นมาประมวลผล อีกทีครับ คือไฟล์มันจะมีทุกวัน วันละ 3 4 gb แล้วต้องทำเป็นเดือนอ่ะครับ
ช่วยชี้แนะทีครับ
ผมไม่รู้ว่าต้องการทำอะไรนะครับแต่จะเป็นไปได้หรือไม่ ที่จะไม่ต้องโหลดไฟล์ทีเดียวทั้งหมด เช่น
อาจโหลดไฟล์ใส่ตัวแปร แค่จำนวนหนึ่ง แล้วส่งกลับ โดยอาจใช้ Ajax ช่วยโหลดทีละ 1000 บรรทัดก็ได้ หรือ
อาจโหลดแค่บรรทัดล่าสุดจำนวนหนึ่งเท่านั้น มาใช้งาน หรือ
อาจอ่านไฟล์ทีละบรรทัด ประมวลผลทันที และเก็บเฉพาะข้อมูลที่ต้องการส่งกลับเท่านั้นไว้ ก็ได้
จริงๆมีอีกหลายวิธีครับ ขึ้นกับความจำเป็นในการใช้งาน แต่โดยหลักการแล้ว แค่เก็บเฉพาะข้อมูลที่ต้องการเท่านั้นครับ
หมายเหตุ php ทำงานกับไฟล์ขนาดใหญ่ได้ครับ และก็ค่อนข้างเร็วด้วย
เลยจำเป็นต้องอ่านทุกบรรทัด เพื่อ นับจำนวนคับ
แต่สิ่งที่ควรทำคือ ทำอย่างไรให้ใช้หน่วยความจำน้อยที่สุด เช่น
1 จัดกลุ่มข้อมูลตั้งแต่ตอนอ่าน เช่น ถ้าต้องการอ่าน IP ที่ไม่ซ้ำกัน ก็รวมไปเลยตั้งแต่ตอนอ่าน
2 อ่านทีละบรรทัด อ่านไปประมวลผลไป ตามข้อ 1
3 เก็บเฉพาะข้อมูลที่ต้องการ เท่านั้น อะไรที่ไม่ใช้กตัดออกไปเลยเพื่อลดหน่วยความจำ
4 ทำทั้งหมดใส่ array ถึงจะทำได้ เตรียมข้อมูลให้เสร็จแล้วค่อย แสดงผล
5 วิธีการเรียงลำดับก็มีผลกับหน่วยความจำ เลือกฟังก์ชั่นให้ถูก จะใช้หน่วยความจำน้อยทีสุด