วิธีปฏิบัติในการจัดเก็บข้อมูล "มีขนาดใหญ่พอสมควร" ของข้อมูลที่เปลี่ยนแปลงแทบจะไม่เคย?


14

คิดในแง่ของตารางการค้นหาที่คำนวณล่วงหน้าหรือบางอย่าง การใช้ฐานข้อมูลแทนค่า hardcoding ในแอปพลิเคชันของฉันมีความเหมาะสมที่จุดใด ค่าจะไม่เปลี่ยนแปลงและแยกออกจากนักพัฒนาการบำรุงรักษาอย่างดี 100 ค่า 1k, 10k, 100k? ฉันต้องการเก็บค่าประมาณ 40k ตอนนี้เป็นswitchคำสั่งที่สร้างโดยเครื่องจักร(ซึ่ง VS2010 ไม่พึงพอใจ)

แก้ไข:

หากใครอยากรู้อยากเห็นนี่คือวิธีที่ฉันเข้าหานี้: ข้อมูลของฉันถูกเก็บไว้ในอาร์เรย์โฟลต 100k สององค์ประกอบนั่นคือสิ่งที่ฉันทำ ใช้เวลาประมาณ 20 วินาทีในการสร้างข้อมูลดังนั้นฉันจึงทำครั้งเดียวแล้วจัดลำดับข้อมูลนั้นเป็นทรัพยากรที่ฝังตัวด้วย BinaryFormatter การนำข้อมูลออกจากกล่องจะใช้เวลาประมาณ 5 มิลลิวินาทีเมื่อเริ่มต้นแอปพลิเคชันและมีประสิทธิภาพสูงกว่าการใช้ฐานข้อมูลที่ฉันกำลังแทนที่

คำตอบ:


5

ข้อเสนอแนะของฉันคือการเก็บข้อมูลในไฟล์หรือตารางฐานข้อมูล หากความเร็วไม่เป็นปัญหาให้ทำการสืบค้นไฟล์หรือฐานข้อมูล (ฐานข้อมูลจะดีกว่า) ในขณะใช้งาน หากหน่วยความจำไม่ใช่ปัญหา แต่คุณต้องการความเร็วบางส่วนจากนั้นโหลดข้อมูลลงในหน่วยความจำเมื่อโปรแกรมเริ่มทำงาน ใน C # คุณสามารถใช้และจัดเรียงรายการหรือ (ตัวเลือกที่ดีที่สุด) ตารางแฮชและมีวิธีการส่งคืนข้อมูลที่คุณต้องการในขณะใช้งานจริง (เช่น getDataValue (สตริง keyToValue)

ฉันขอแนะนำให้คุณไม่ใช้คำสั่ง switch เพราะมันจะยากมากที่จะรักษาและจะส่งผลให้ exe ขนาดใหญ่

Hash-table เช่นhttp://support.microsoft.com/kb/309357


ในที่สุดนี่คือสิ่งที่ฉันทำ: ตรวจสอบโพสต์ที่อัปเดตของฉัน
ไบรอัน Boettcher

1
+1 สำหรับคำแนะนำฐานข้อมูล ฐานข้อมูลถูกสร้างขึ้นเพื่อจัดเก็บข้อมูลปริมาณมากและช่วยให้คุณสามารถดึงข้อมูลได้อย่างรวดเร็ว
NoChance

ดูstackoverflow.com/questions/301371/…ว่าทำไมจึงควรใช้พจนานุกรมสำหรับสิ่งนี้แทนที่จะเป็น hashtable YMMV
Chris McKee

6

ส่วนตัวแล้วฉันก็โอเคที่จะเก็บข้อมูลจำนวนเท่าใดก็ได้ซึ่งฮาร์ดโค้ดลงในแอปพลิเคชันจนกว่าจะไม่จำเป็นต้องบิดมันสำหรับการปรับใช้หรือโปรแกรมแก้ไขด่วนอย่างใดอย่างหนึ่งโดยเฉพาะ

อย่างไรก็ตามการจัดเก็บและการเข้าถึงข้อมูลโดยใช้คำสั่งสวิตช์ C # นั้นเป็นวิธีปฏิบัติที่ไม่ดีเนื่องจากในการจัดเก็บข้อมูลและการเข้าถึงข้อมูลแบบคู่ที่ จำกัด และมีวิธีการเข้าถึงวิธีเดียวเท่านั้น

ฉันต้องการจัดเก็บข้อมูลใน Hashtable หรือพจนานุกรมและจัดให้มีชั้นเรียนแยกต่างหากสำหรับการดึงข้อมูลและมีการใส่ข้อมูลพจนานุกรมการค้นหาครั้งเดียว

เมื่อเร็ว ๆ นี้ฉันพบว่าค่อนข้างสะดวกในการใช้ DSL ขนาดเล็กสำหรับการระบุกฎเกณฑ์ทางธุรกิจ ( ส่วนติดต่อที่คล่องแคล่วสำหรับ SiteMapหรือเครื่องคิดเลขภาษีสัมภาษณ์คำถามเช็ควิธี "คำนวณ" สำหรับการกำหนดกฎ) แล้วให้วัตถุแยกต่างหากสำหรับการสืบค้นกฎเหล่านี้ เทคนิคนี้จะใช้ดีสำหรับสถานการณ์กรณีสลับ

ข้อดีอย่างหนึ่งของการย่อยสลายคือคุณสามารถใช้จำนวนการดูข้อมูลของคุณโดยไม่ต้องแตะเส้น XXXk เส้นที่กำหนดข้อมูลนั้น


ฉันได้ขยายคำตอบด้วยตัวอย่างบางส่วน
Valera Kolupaev

2

ข้อความสั่งสวิตช์ 40k นั้นน่าสงสัยเล็กน้อย ฉันคิดว่าคุณยังต้องดำเนินการค้นหาใช่มั้ย คุณลอง encapsulating ข้อมูลหรือไม่ จากนั้นใช้ LINQ เพื่อดำเนินการค้นหาในคอลเลกชันเพื่อทดสอบประสิทธิภาพ รับครั้งคอนกรีตบางส่วนโดยการเรียกใช้การทดสอบหน่วยมีการจับเวลาเหมือนนาฬิกาจับเวลา ถ้าคุณคิดว่ามันอาจจะใช้งานได้ ดูว่าประสิทธิภาพเป็นที่ยอมรับสำหรับผู้ใช้หรือไม่


2

ฉันมีความต้องการเช่นนี้สองครั้ง แอปพลิเคชันได้รับการออกแบบให้เป็นแบบสแตนด์อโลนโดยไม่จำเป็นต้องตั้งค่า / เข้าถึงฐานข้อมูล ในทั้งสองกรณีฉันใช้ไฟล์ XML เพื่อเก็บข้อมูล ในอันแรกซึ่งอยู่ใน 2.0 Framework ฉันใช้การแยกวิเคราะห์ XML แบบเก่าเพื่อค้นหาข้อมูล สำหรับรุ่นใหม่บน 3.5 Framework ฉันใช้ LINQ กับ XML เพื่อค้นหาสิ่งที่ฉันต้องการ ในทั้งสองกรณีการเข้าถึงข้อมูลถูกห่อหุ้มในคลาส


1

สิ่งสำคัญที่นี่คือเพื่อให้แน่ใจว่าอินเทอร์เฟซสาธารณะของคุณห่อหุ้มการใช้งานของคุณ - แต่นั่นไม่ใช่คำถามของคุณและไม่มีเหตุผลที่จะคิดว่าคุณไม่มี นอกเหนือจากนั้นมันเป็นเพียงคำถามของประสิทธิภาพเทียบกับความเศร้าโศก (และความแตกต่างของประสิทธิภาพอาจไม่คุ้มค่าที่จะดูแล) ในฐานะที่เป็นโซลูชันที่ใช้งานได้จริงสำหรับปัญหา VS 2010 คุณสามารถแบ่งคำสั่ง case เป็นลำดับชั้นของคำสั่ง case ได้เสมอ - ระดับสูงสุดสามารถเรียกหนึ่งใน 10 วิธีอื่น ๆ ตัวอย่างเช่นแต่ละ case มีคำสั่ง case 4000 เคส คุณสามารถใส่ 10 แต่ละไฟล์เป็นไฟล์ของตัวเองถ้าคุณต้อง น่าเกลียดเล็กน้อย แต่คุณกำลังสร้างรหัสอยู่ดี

สำหรับตัวเลขที่จะเปลี่ยนไปเป็น DB- เพียงแค่เมื่อใดก็ตามที่ไม่ได้ใช้ DB จะกลายเป็นปัญหา


ฉันซาบซึ้งกับความคิดที่ว่าอินเทอร์เฟซของฉันได้รวมการใช้งานไว้ ฟังก์ชั่นถูกเปิดเผยด้วยGetValuesForInputวิธีการชนิดและคำสั่งขนาดใหญ่ของฉันถูกซ่อนอยู่ในการใช้งาน
ไบรอันโบ

1

คุณสามารถใช้บางอย่างเช่น SQL Compact วางข้อมูลในตารางและปล่อยให้ไฟล์ DB ในโครงการ ตารางเหมาะสำหรับปริมาณข้อมูลนั้นมากกว่าคำสั่ง switch


1

ฉันคิดว่าคำสำคัญที่นี่คือ 'แทบจะไม่'

หากข้อมูลไม่เคยเปลี่ยนแปลง - ตัวอย่างเช่นค่าทางคณิตศาสตร์ที่คำนวณไว้ล่วงหน้าค่าคงที่สีและค่าอื่น ๆ - จากนั้นตรวจสอบว่าตราบใดที่ขนาดสามารถจัดการได้ให้คุณเก็บไว้ในรหัส โปรดทราบว่าหากประสิทธิภาพเป็นปัญหาคำสั่ง case / switch จะช้ามากเมื่อเทียบกับตัวเลือกอื่น ๆ

หากข้อมูลแทบจะไม่เคยเปลี่ยนแปลง - ตัวอย่างเช่นรหัสพื้นที่โทรศัพท์ขอบเขตของประเทศและสิ่งที่คล้ายกัน - ฉันอาจตรวจสอบการเก็บข้อมูลภายนอกในบางลักษณะ โดยเฉพาะอย่างยิ่งถ้ามันเริ่มได้รับมากกว่าสองโหลค่า


1
ขึ้นอยู่กับว่าคอมไพเลอร์ดีแค่ไหน คำสั่งกรณีใน Delphi อาจมีประสิทธิภาพมาก
Loren Pechtel

1

หากคุณเก็บข้อมูลจำนวนมากลงในแอปพลิเคชันของคุณโปรแกรมของคุณอาจโหลดช้าลงและคุณอาจเปิดเผยรหัสให้มีความเสี่ยงในกรณีที่บางคนสามารถเล่นกับไบนารีหรือไฟล์ที่เรียกใช้งานได้

นอกจากนี้หากโปรแกรมได้รับการแก้ไขหลายครั้งใครจะรู้คุณอาจแนะนำข้อผิดพลาดด้วยการพิมพ์ตัวเลขโดยไม่ได้ตั้งใจโดยไม่ตั้งใจหรือเป็นผลมาจากคำสั่งการเปลี่ยนแปลง

อาจเป็นในอนาคตบางคนขอให้เรียกใช้แบบสอบถามกับข้อมูลพูดบางคนอาจถามหาค่าเฉลี่ยของคอลัมน์ซึ่งในกรณีนี้คุณจะต้องเปลี่ยนใบสมัครของคุณและเพิ่มวิธีการคำนวณทุกแบบสอบถามที่ผู้ใช้ของคุณมา ด้วยแล้วไปตามขั้นตอนทั้งหมดเพื่อโปรโมตโค้ดของคุณไปยังการผลิต อันนี้ไม่ดีจริงๆ

การแยกข้อมูลและรหัสเป็นการปฏิบัติที่ดีเป็นพิเศษหากข้อมูลมีขนาดใหญ่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.