ฉันกำลังวางแผนในการจัดเก็บสแกนจากแมสสเปคโตรมิเตอร์ในฐานข้อมูล MySQL และต้องการทราบว่าการจัดเก็บและวิเคราะห์ข้อมูลจำนวนนี้เป็นไปได้จากระยะไกลหรือไม่ ฉันรู้ว่าประสิทธิภาพอาจแตกต่างกันไปขึ้นอยู่กับสภาพแวดล้อม แต่ฉันกำลังมองหาลำดับความสำคัญอย่างคร่าวๆ: ข้อความค้นหาจะใช้เวลา 5 วันหรือ 5 มิลลิวินาทีหรือไม่
รูปแบบอินพุต
ไฟล์อินพุตแต่ละไฟล์มีสเปคโตรมิเตอร์วิ่งเดียว การทดสอบแต่ละครั้งประกอบด้วยชุดของการสแกนและการสแกนแต่ละครั้งจะมีชุดข้อมูลที่สั่งซื้อ มีข้อมูลเมตาเล็กน้อย แต่ส่วนใหญ่ของไฟล์ประกอบด้วยอาร์เรย์ int หรือ 32- หรือ 64- บิต
ระบบโฮสต์
| ---------------- + ------------------------------- | | ระบบปฏิบัติการ | Windows 2008 64-bit | | รุ่น MySQL 5.5.24 (x86_64) | | ซีพียู | 2x Xeon E5420 (ทั้งหมด 8 คอร์) | RAM | 8GB | | ระบบไฟล์ SSD 500 GiB | | HDD RAID | 12 TiB | | ---------------- + ------------------------------- |
มีบริการอื่น ๆ ที่ใช้งานบนเซิร์ฟเวอร์โดยใช้เวลาตัวประมวลผลเล็กน้อย
สถิติไฟล์
| ------------------ + -------------- | | จำนวนไฟล์ | ~ 16,000 | | ขนาดทั้งหมด 1.3 TiB | | ขนาดขั้นต่ำ 0 ไบต์ | | ขนาดสูงสุด 12 GiB | | หมายถึง | 800 MiB | | ค่ามัธยฐาน | 500 MiB | | ดาต้าพอยน์ทั้งหมด ~ 200 พันล้าน | | ------------------ + -------------- |
จำนวนรวมของ datapoints เป็นมากประมาณการคร่าวๆ
สคีมาที่เสนอ
ฉันวางแผนในการทำสิ่งที่ "ถูกต้อง" (เช่น normalizing ข้อมูลอย่างบ้าคลั่ง) และอื่น ๆ จะมีruns
ตารางเป็นspectra
ตารางที่มีคีย์ต่างประเทศเพื่อruns
และตารางที่มีคีย์ต่างประเทศเพื่อdatapoints
spectra
คำถามดาต้าพอยน์ 200 พันล้าน
ฉันจะทำการวิเคราะห์ในสเปกตรัมหลาย ๆ ตัวและอาจเป็นหลาย ๆ วิ่งทำให้เกิดข้อความค้นหาที่สามารถสัมผัสแถวนับล้านได้ สมมติว่าฉันทำดัชนีทุกอย่างถูกต้อง (ซึ่งเป็นหัวข้อสำหรับคำถามอื่น) และไม่พยายามสับเปลี่ยน MiB นับร้อยผ่านเครือข่ายมันเป็นไปได้หรือไม่ที่ MySQL จะจัดการเรื่องนี้จากระยะไกล
ข้อมูลเพิ่มเติม
ข้อมูลการสแกนจะมาจากไฟล์ใน XML-based
mzMLรูปแบบ เนื้อของรูปแบบนี้อยู่ใน
<binaryDataArrayList>
องค์ประกอบที่เก็บข้อมูล การสแกนแต่ละผลิต> = 2 <binaryDataArray>
องค์ประกอบที่นำมารวมกันในรูปแบบ 2 มิติ (หรือมากกว่า) [[123.456, 234.567, ...], ...]
อาร์เรย์ของฟอร์ม
ข้อมูลเหล่านี้เป็นแบบเขียนครั้งเดียวดังนั้นประสิทธิภาพการอัปเดตและความปลอดภัยของธุรกรรมจึงไม่เกี่ยวข้อง
แผนการที่ไร้เดียงสาของฉันสำหรับสคีมาฐานข้อมูลคือ:
runs
โต๊ะ
| ชื่อคอลัมน์ | ประเภท | | ------------- + ------------- | | id | คีย์หลัก | | start_time | TIMESTAMP | | ชื่อ | VARCHAR | | ------------- + ------------- |
spectra
โต๊ะ
| ชื่อคอลัมน์ | ประเภท | | ---------------- + ------------- | | id | คีย์หลัก | | ชื่อ | VARCHAR | | ดัชนี | INT | | สเปกตรัม | INT | | การเป็นตัวแทน | INT | | run_id | คีย์ต่างประเทศ | ---------------- + ------------- |
datapoints
โต๊ะ
| ชื่อคอลัมน์ | ประเภท | | ------------- + ------------- | | id | คีย์หลัก | | สเปกตรัม | คีย์ต่างประเทศ | mz | สองเท่า | | num_counts | สองเท่า | | ดัชนี | INT | | ------------- + ------------- |
มันสมเหตุสมผลหรือไม่
ดังนั้นในขณะที่คุณสามารถอนุมานได้ฉันเป็นโปรแกรมเมอร์ไม่ใช่นักชีววิทยาในห้องปฏิบัติการดังนั้นฉันจึงไม่รู้วิทยาศาสตร์เกือบเท่านักวิทยาศาสตร์จริง ๆ
นี่คือพล็อตของสเปกตรัมเดียว (สแกน) ของประเภทของข้อมูลที่ฉันจะจัดการ:
เป้าหมายของซอฟต์แวร์คือการหาจุดที่สำคัญและอย่างไร เราใช้แพคเกจซอฟต์แวร์ที่เป็นกรรมสิทธิ์เพื่อคิดออกตอนนี้ แต่เราต้องการที่จะเขียนโปรแกรมการวิเคราะห์ของเราเอง (ใน R) เพื่อให้เรารู้ว่าสิ่งที่เกิดขึ้นภายใต้แผ่น อย่างที่คุณเห็นข้อมูลส่วนใหญ่นั้นไม่น่าสนใจ แต่เราไม่ต้องการทิ้งข้อมูลที่อาจเป็นประโยชน์ซึ่งอัลกอริทึมของเราพลาด เมื่อเรามีรายการของจุดสูงสุดที่น่าจะเป็นที่เราพอใจแล้วไปป์ไลน์ที่เหลือจะใช้รายการสูงสุดนั้นแทนที่จะเป็นรายการดิบของดาต้าพอยน์ ฉันคิดว่ามันจะเพียงพอที่จะจัดเก็บดาต้าพอยน์ดิบเป็นหยดขนาดใหญ่เพื่อให้พวกเขาสามารถวิเคราะห์อีกครั้งหากจำเป็น แต่เก็บยอดเขาเป็นรายการฐานข้อมูลที่แตกต่างกันเท่านั้น ในกรณีนั้นจะมีเพียงไม่กี่จุดสูงสุดต่อสเปกตรัมดังนั้นสิ่งที่ปรับขนาดบ้าควรจะ '