Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > .NET Framework > Forum > อยากเขียนโปรแกรมเพื่อกรองข้อมูลโดยมีเป็น 10 ล้านrecord โดยให้ประมวลผลใช้เวลาน้อยที่สุด



 

อยากเขียนโปรแกรมเพื่อกรองข้อมูลโดยมีเป็น 10 ล้านrecord โดยให้ประมวลผลใช้เวลาน้อยที่สุด

 



Topic : 066937



โพสกระทู้ ( 44 )
บทความ ( 0 )



สถานะออฟไลน์




คือผมต้องการเขียนโปรแกรมกรองเบอร์โทรศัพท์
โดยการรับค่าเป็น file.text เข้ามา 2 ไฟล์
ซึ่งไฟล์แรกจะมีเบอร์โทรสัพประมาน 10 ล้านเบอร์ = 10ล้านrecord --------------------------> ชื่อไฟล์ A
และไฟล์ที่สองประมาน 15000 record ---------------------------> ชื่อไฟล์ B

และก้อเอาสองไฟล์มาเปรียบเทียบค่ากัน โดยเอาเฉพาะเบอร์ที่มีใน A แต่ไม่มีใน B และเขียนเบอร์ที่ได้ลงไพล์ใหม่

อยากทราบว่าจะเขียนโปรแกรมด้วยc#.netยังไงให้ประมานผลเร็วคับ เพราะผมลองเขียนขนาดแค่ 1ล้าน record ยังช้ามากเลยครับ
พี่ๆที่เก่งช่วยแนะนำหน่อยนะครับ ขอบคุนมากกกคับ



Tag : .NET, C#, VS 2008 (.NET 3.x)









ประวัติการแก้ไข
2011-09-21 22:24:13
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2011-09-21 20:31:19 By : sayhello View : 1966 Reply : 4
 

 

No. 1



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

10 ล้าน Record ยังไงก็ช้าครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-09-21 22:52:57 By : webmaster
 


 

No. 2



โพสกระทู้ ( 76 )
บทความ ( 0 )



สถานะออฟไลน์


ขอดู sql ที่เขียนหน่อยครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-09-22 10:01:54 By : cyberstein
 

 

No. 3

Guest


เอาเบอร์โทรใน ไฟล์ B มาสร้างเป็น Tree

แล้วเอาเบอร์ใน ไฟล์ A มาไล่ตรวจสอบกับ Tree

ผมว่าน่าจะเร็วขึ้นนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-09-22 16:57:21 By : np007
 


 

No. 4



โพสกระทู้ ( 154 )
บทความ ( 0 )



สถานะออฟไลน์


สิ่งที่คุณต้องพิจารณาเป็นอันดับแรกก็คืนถอยไปยังบทเรียนวิชา Algorithms ก่อน ว่าเราเคยเรียนอะไรผ่านมาบ้าง ผมก็มานั่งนึก ๆ ดูว่า ถ้าจำไม่ผิดในวิชา Computer Algorithms ชื่อหนังสือ Computer Algorithms Introduction to Design & Analysis Third Edition ผู้แต่งคือ Sara Baase และ Allen Van Gelder หรือเลข ISBN 0-201-61244-5 เล่มนี้ในบทที่ 11 จะกล่าวถึง String Matching ครับ

แน่นอนว่าผมนึกไปถึง Algorithms ของท่าน Boyer-Moore ซึ่งเรียกได้ว่าเป็นที่สุดของกึ๋นในการตรวจสอบ String โดยที่ปัจจุบันนี้ก็ได้มีการ Apply Algorithms ของท่านมากมายแต่ก็ยังคงหลักเดิมไว้อยู่ ซึ่งคำว่าที่สุดหมายถึงมีการคำนวณที่เร็วกว่า Algorithms ของท่าน Knuth-Morris-Pratt หลายเท่า โดยเปรียบเทียบในเชิง BigO แล้ว ของท่าน Knuth-Morris-Pratt นั้นจะใช้เวลาการ Compare ที่ O(2n) แต่เมื่อมาในยุคท่าน Boyer-Moore ท่านใช้เวลาเพียง O(m) เท่านั้น โดย n คือจำนวนความยาวของ string ทั้งหมด และ m คือจำนวน string ที่ใช้ในการตรวจสอบ

อ่านมาถึงตรงนี้แล้วผมก็คำนวณคร่าว ๆ ว่า ถ้าข้อมูลของ จขกท. มี 10 ล้าน Records เบอร์โทรศัพท์มี 10 ตัว ดังนั้นจะมีจำนวน string โดยรวมทั้งหมดประมาณ 100 ล้านตัวอักษร และจำนวน string เปรียบเทียบของคุณคือ 15000 เลขหมาย เท่ากับ 150,000 ตัวอักษร

สรุปคร่าว ๆ ก็คือ หากใช้ของท่าน Knuth-Morris-Pratt จะอยู่ที่ O(200 ล้าน)
แต่หากใช้ของท่าน Boyer-Moore จะอยู่ที่ O(150,000) ต่างกันเห็น ๆ เลยนะเนี่ย

เอาเป็นว่าผมแนะนำของท่าน Boyer-Moore ดีกว่า ที่นี้มาดูที่ Source Code กันซะหน่อย ผมก็สืบเสาะหาตาม Google ก็พบว่ามีคนนำ Algorithms ของท่านมาเขียนเป็นที่เรียบร้อยแล้ว อยู่ที่ http://www.codeproject.com/KB/recipes/BoyerMooreSearch.aspx นะครับ

เมื่อผม include เข้ามายังโปรเจคเพื่อทดสอบ ปรากฎว่า Character ที่คนพัฒนานั้นกำหนด Bad Character ไม่ครบตามความเป็นจริงในรหัสของ ASCII ซึ่งควรจะมีอยู่ที่ 65535 รูปแบบ แต่จากตัวอย่างเค้ากำหนดเพียงแค่ 255 รูปแบบเท่านั้น ผมจึงทำการ Modify บรรทัดที่ 47 ของ Code จาก

Code (C#)
int[] badCharacterShift = new int[256];


มาเป็น

Code (C#)
int[] badCharacterShift = new int[65536];


ส่วนวิธีการเรียกใช้งานให้ทดลองตามนี้

Code (C#)
StringMatch.BoyerMoore bm = new StringMatch.BoyerMoore("Neural");
string text = string.Empty;

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"D:\test.txt"))
{
            text = sr.ReadToEnd();
            sr.Close();
}

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
            
foreach (int index in bm.BoyerMooreMatch(text))
{
            //Console.WriteLine("Matched at index {0}", index);
}

sw.Stop();
Console.WriteLine("Boyer Moore = " + sw.Elapsed.TotalSeconds);


จาก Code ผมมีไฟล์ที่ชื่อ test.txt เก็บอยู่ที่ Drive D โดยในไฟล์ text.txt มีเนื้อหาข้อมูล text ยาวประมาณ 180,000 ตัวอักษร และบรรทัดแรกมีการสร้าง Instance BoyerMoore bm โดยตรงนี้ จขกท. ต้องกำหนดค่าที่ต้องการค้นหานะครับ ผมสมมุติเป็นคำว่า "Neural" ถ้าเป็นตัวอักษรเป็น Case Sensitive นะครับ แต่ตัวเลขก็ไม่มีปัญหาอะไร เปิด StreamReader อ่านไฟล์เข้ามาเก็บในตัวแปร text และใช้ method bm.BoyerMooreMatch(text) แต่ตรงนี้ต้องวนลูปเพราะว่าการทำ String Matching ต้องค้นหาตัวอักษรในชุดต่อไป ถ้าพบจะมีการคืนค่า index เป็นค่า integer ออกมานะครับว่าพบคำว่า Neural แล้วที่ Index เท่าไร

อ่านมาถึงตรงนี้น่าจะถึงบางอ้อแล้วนะครับ ส่วน Stopwatch ผมไว้จับเวลาเฉย ๆ ผลที่ได้ก็คือ ในไฟล์ของผมนั้นจะมีคำว่า Neural อยู่ทั้งหมด 150 คำ โดยหาได้ที่ความเร็ว Boyer Moore = 0.0046267 วินาที ด้วยความเร็วขนาดนี้กระพิบตา 1 ครั้งยังช้ากว่าเลย

หากเป็นข้อมูลของคุณ จขกท. ก็คูณตรง ๆ ที่ 0.0046267 * 15000 ประมาณ 69 วินาที (แต่ว่าจริง ๆ จะไม่ช้าขนาดนั้น)

เรื่องสุดท้ายคือการเขียนไฟล์ลงไปใหม่ ถ้าต้องการที่จะให้เขียนเร็ว ๆ ให้ต่อ string ใน ram ก่อน จากนั้นค่อย Flush ค่าลงไฟล์ทีเดียวครับด้วย Class StreamWriter ก็จะทำให้เขียนไฟล์ได้เร็วขึ้น

ผมหวังว่าคุณจะ Apply ได้ต่อเอาเองนะครับว่าจะทำให้เบอร์โทรในไฟล์ A ถูกลบด้วยไฟล์ B อย่างไร โชคดีครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-01-06 22:38:37 By : gunnermontana
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : อยากเขียนโปรแกรมเพื่อกรองข้อมูลโดยมีเป็น 10 ล้านrecord โดยให้ประมวลผลใช้เวลาน้อยที่สุด
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 01
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่