วิธีจัดการกับการควบคุมเวอร์ชันของข้อมูล (ไบนารี) จำนวนมาก


46

ฉันเป็นนักศึกษาปริญญาเอกสาขาธรณีฟิสิกส์และทำงานกับข้อมูลภาพจำนวนมาก (หลายร้อย GB, ไฟล์นับหมื่น) ฉันรู้svnและgitค่อนข้างดีและให้คุณค่ากับประวัติโครงการรวมกับความสามารถในการทำงานร่วมกันได้อย่างง่ายดายและมีการป้องกันความเสียหายของดิสก์ ฉันพบว่าgitมีประโยชน์อย่างมากสำหรับการสำรองข้อมูลที่สอดคล้องกัน แต่ฉันรู้ว่า git ไม่สามารถจัดการข้อมูลไบนารีจำนวนมากได้อย่างมีประสิทธิภาพ

ในการศึกษาระดับปริญญาโทของฉันฉันทำงานกับชุดข้อมูลที่มีขนาดใกล้เคียงกัน (รวมถึงรูปภาพ) และมีปัญหามากมายในการติดตามเวอร์ชันต่าง ๆ บนเซิร์ฟเวอร์ / อุปกรณ์ที่แตกต่างกัน การกระจาย 100GB ผ่านเครือข่ายไม่สนุกและทำให้ฉันเสียเวลาและความพยายาม

ฉันรู้ว่าคนอื่น ๆ ในสาขาวิทยาศาสตร์ดูเหมือนจะมีปัญหาคล้ายกัน แต่ฉันไม่สามารถหาทางออกที่ดีได้

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

สุดท้ายฉันต้องการสิ่งที่นักวิจัยคนอื่นสามารถใช้ได้ดังนั้นมันไม่จำเป็นต้องง่ายสุด ๆ แต่ควรจะเรียนรู้ได้ในเวลาไม่กี่ชั่วโมง

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

  • svnค่อนข้างไม่มีประสิทธิภาพและต้องการสมาร์ทเซิร์ฟเวอร์
  • hg bigfile / largefileสามารถใช้รีโมตเดียวได้
  • git bigfile / mediaสามารถใช้รีโมตเดียวได้ แต่ก็ไม่ได้มีประสิทธิภาพมากนัก
  • ห้องใต้หลังคาดูเหมือนจะไม่มีบันทึกหรือความสามารถที่แตกต่างกัน
  • bupดูดีมาก แต่ต้องการเซิร์ฟเวอร์ "สมาร์ท" ให้ใช้งานได้

ฉันได้ลองgit-annexแล้วซึ่งทำทุกอย่างที่ฉันต้องการเพื่อทำ (และอื่น ๆ อีกมากมาย) แต่มันยากมากที่จะใช้และไม่มีเอกสารที่ดี ฉันใช้มันหลายวันและไม่สามารถไปรอบ ๆ มันได้ดังนั้นฉันสงสัยว่าเพื่อนร่วมงานคนอื่นจะสนใจ

นักวิจัยจัดการกับชุดข้อมูลขนาดใหญ่ได้อย่างไรและกลุ่มการวิจัยอื่น ๆ ใช้งานอย่างไร

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


1
@scaaahu ฉันไม่คิดว่ามันเป็นคำถามซอฟต์แวร์ คำตอบที่ยอมรับได้ยังสามารถอธิบายเวิร์กโฟลว์หรือการรวมกันของเครื่องมือและระบบ (อย่างไรก็ตามการอยู่ในหัวข้ออื่นไม่ควรเล่นเพื่อตัดสินใจปิดคำถามที่นี่)

2
เพียงเพื่อป้องกันความเสียหายของข้อมูลด้วยข้อมูลภาพฉันเรียกใช้สคริปต์ที่คำนวณไฟล์เช็คซัมอีกครั้งด้วยไฟล์ทั้งหมดและไฟล์ตรวจสอบ md5 ไฟล์เช็คซัมจะถูกเก็บไว้ในคอมไพล์ ตอนนี้ฉันสามารถเห็นได้ทันทีด้วย git diff ถ้ามีเช็คซัมใด ๆ เปลี่ยนไป และฉันยังสามารถดูไฟล์ที่ถูกลบและเพิ่ม และหากมีตัวอย่างของสัญญาณข้อมูลเสียหายฉันสามารถใช้การสำรองข้อมูลปกติเพื่อกู้คืนเวอร์ชันเก่าได้ ไม่สมบูรณ์แบบ แต่ดีกว่าไม่มีอะไร

1
@JukkaSuomela ฉันคิดว่ามันเป็นคำถามที่สมเหตุสมผลเมื่อคุณมีชุดข้อมูลที่มีขนาดใหญ่มากหากชุดข้อมูลเหล่านั้นเปลี่ยนบ่อย ... ในกรณีเหล่านั้นการสำรองข้อมูลมักจะเป็นสิ่งที่ใช้เป็นตัวควบคุมเวอร์ชัน

1
ฉันลงคะแนนให้ปิดคำถามนี้เป็นนอกหัวข้อเนื่องจากเกี่ยวข้องกับข้อมูล / ฐานข้อมูลมากกว่าสิ่งที่เฉพาะเจาะจงกับสถาบันการศึกษา คำถามนั้นยอดเยี่ยมและ (IMHO) ควรย้ายไปยัง DataScience.SE หรือ (บางที) Databases.SE
Piotr Migdal

1
นักวิทยาศาสตร์ @Johann Data มีภูมิหลังที่แตกต่างกัน ฉันอยู่ในกลศาสตร์ควอนตัมเช่น ประเด็นทั้งหมดที่นี่คือ: 1. StackExchange ไม่สนับสนุนคำถามเรือที่เรียกว่าและ 2. ดีกว่าที่จะได้รับการปฏิบัติที่ดีที่สุดแทนที่จะเป็นวิธีการแก้ไขโดยคนที่ต้องแก้ปัญหา แต่ไม่มีความคิด
Piotr Migdal

คำตอบ:


12

สิ่งที่ฉันใช้คือโซลูชันไฮบริด:

  • สำรองข้อมูลดิบ
  • คอมไพล์ของเวิร์กโฟลว์
  • ภาพรวมคู่มือของเวิร์กโฟลว์ + ข้อมูลที่ประมวลผลซึ่งมีความเกี่ยวข้องเช่น:
    • การประมวลผลล่วงหน้ามาตรฐาน
    • ใช้เวลานานจริงๆ
    • สำหรับสิ่งพิมพ์

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


ฉันกำลังใช้find . -type f -print0 | xargs -0 md5sum > checksums.md5ในการคำนวณผลรวมตรวจสอบและmd5sum -c checksums.md5ตรวจสอบและรุ่นควบคุมการตรวจสอบ ที่ช่วยในการตรวจสอบข้อมูลในสถานที่ต่าง ๆ / บนเครื่องที่แตกต่างกัน ดูเหมือนจะเป็นสิ่งที่ดีที่สุดที่เราสามารถทำได้ในขณะนี้
โยฮัน

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

@ Norok คุณได้อธิบายกรอบทั่วไปที่ดี ฉันใช้งานสิ่งที่คล้ายกันในเครื่องมือ DVC - โปรดดูคำตอบของฉันด้านล่าง ฉันขอขอบคุณข้อเสนอแนะของคุณ
Dmitry Petrov

9

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

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


Dropbox เวอร์ชันโอเพ่นซอร์สยอดนิยมคือ OwnCloud ฉันยังไม่ได้ลองเลย

9

ฉันใช้การกำหนดเวอร์ชันในถังเก็บ Amazon S3เพื่อจัดการ 10-100GB ในไฟล์ 10-100 การถ่ายโอนอาจช้าดังนั้นจึงช่วยบีบอัดและถ่ายโอนแบบขนานหรือเพียงแค่เรียกใช้การคำนวณบน EC2 Botoห้องสมุดมีอินเตอร์เฟซหลามดี


8

ลองมองหาที่Git ไฟล์ขนาดใหญ่จัดเก็บข้อมูล (LFS) มันใหม่ แต่อาจเป็นสิ่งที่ควรค่าแก่การดู

อย่างที่ฉันเห็นการอภิปรายใน Hacker Newsกล่าวถึงวิธีอื่น ๆ ในการจัดการกับไฟล์ขนาดใหญ่:


6

เราไม่ควบคุมเวอร์ชันของไฟล์ข้อมูลจริง เราไม่ต้องการแม้ว่าเราจะจัดเก็บเป็น CSV แทนในรูปแบบไบนารี ดังที่Riccardo M.กล่าวว่าเราจะไม่ใช้เวลาในการตรวจสอบการเปลี่ยนแปลงแบบแถวต่อแถวในชุดข้อมูลแถว 10M

ฉันจะควบคุมข้อมูลเมตาแทนพร้อมกับรหัสการประมวลผล

  • วันที่แก้ไข
  • ขนาดไฟล์
  • จำนวนแถว
  • ชื่อคอลัมน์

สิ่งนี้ทำให้ฉันมีข้อมูลมากพอที่จะรู้ว่าไฟล์ข้อมูลมีการเปลี่ยนแปลงหรือไม่และแนวคิดเกี่ยวกับสิ่งที่เปลี่ยนแปลง (เช่นการเพิ่ม / ลบแถว, คอลัมน์ใหม่ / เปลี่ยนชื่อ) โดยไม่ทำให้ VCS เครียด


5

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

ฉันได้สร้างขึ้นและเพิ่งเปิดตัวเครื่องมือที่มาเปิดการแก้ปัญหานี้ - DVC

โดยทั่วไปจะรวมรหัสของคุณใน Git และข้อมูลในดิสก์ภายในเครื่องหรือคลาวด์ของคุณ (ที่เก็บ S3 และ GCP) DVC ติดตามการพึ่งพาระหว่างข้อมูลและรหัสและสร้างกราฟการพึ่งพา (DAG) ช่วยให้คุณทำโครงการของคุณทำซ้ำได้

สามารถแชร์โครงการ DVC ได้ง่าย - ซิงค์ข้อมูลของคุณไปยังคลาวด์ (คำสั่ง dvc sync) แบ่งปันที่เก็บ Git ของคุณและให้การเข้าถึงที่เก็บข้อมูลของคุณในคลาวด์

"เรียนรู้ได้ในเวลาไม่กี่ชั่วโมง" - เป็นจุดที่ดี คุณไม่ควรมีปัญหาใด ๆ กับ DVC หากคุณคุ้นเคยกับ Git คุณจำเป็นต้องเรียนรู้คำสั่งเพียงสามคำเท่านั้น:

  1. dvc initgit initชอบ - ควรทำในที่เก็บ Git ที่มีอยู่
  2. dvc import- นำเข้าไฟล์ข้อมูลของคุณ (แหล่งที่มา) ไฟล์หรือ URL ในเครื่อง
  3. dvc run- dvc run python mycode.py data/input.jpg data/output.csvขั้นตอนของกระบวนการทำงานของคุณเช่น DVC มาจากการพึ่งพาระหว่างขั้นตอนของคุณโดยอัตโนมัติสร้าง DAG และเก็บไว้ใน Git
  4. dvc repro- ทำซ้ำไฟล์ข้อมูลของคุณ ตัวอย่าง: vi mycode.py- เปลี่ยนรหัสจากนั้นdvc repro data/output.csvจะทำซ้ำไฟล์ (และการอ้างอิงทั้งหมด

คุณต้องเรียนรู้คำสั่ง DVC เพิ่มเติมอีกสองสามคำเพื่อแบ่งปันข้อมูลผ่านคลาวด์และทักษะ S3 หรือ GCP ขั้นพื้นฐาน

การสอน DVC เป็นจุดเริ่มต้นที่ดีที่สุด - "การควบคุมเวอร์ชันของข้อมูล: การเรียนรู้ด้วยเครื่องซ้ำ"


1
สามารถใช้กับการจัดเก็บไฟล์ไบนารีขนาดใหญ่เท่านั้น (ส่วนใหญ่เป็นวิดีโอ) ML ไม่ใช่เป้าหมาย เป้าหมายคือมี repo เพื่อจัดเก็บไฟล์ไบนารีขนาดใหญ่ Repo ควรมีแคชการชำระเงิน / ดึงที่เลือก (เช่น perforce) และกลไกการล็อกไฟล์ / ไดเรกทอรี เหมาะสำหรับวัตถุประสงค์ดังกล่าวหรือไม่
hemu

1
@hemu ใช่ DVC ทำงานได้ดีสำหรับสถานการณ์ไฟล์ข้อมูลขนาดใหญ่ขั้นพื้นฐานโดยไม่มีฟีเจอร์ ML (เช่นไพพ์ไลน์ ML และการทำซ้ำ) Perforce-lock semantic ไม่รองรับเนื่องจาก Git semantic โปรดใช้การชำระเงินต่อไฟล์แทน
Dmitry Petrov


0

คุณสามารถดูโครงการของฉันที่ชื่อ DOT: Distrubuted Object Tracker repository manager
มันเป็น VCS ที่ง่ายมากสำหรับไฟล์ไบนารีสำหรับการใช้งานส่วนตัว (ไม่มีการทำงานร่วมกัน)
มันใช้ SHA1 สำหรับการตรวจสอบและป้องกันการซ้ำซ้อน การซิงค์ P2P แบบเต็ม
หนึ่งในคุณสมบัติที่ไม่เหมือนใคร: adhoc เซิร์ฟเวอร์ TCP หนึ่งครั้งสำหรับการดึง / ดัน
นอกจากนี้ยังสามารถใช้ SSH เพื่อการขนส่ง

ยังไม่ออก แต่อาจเป็นจุดเริ่มต้นที่ดี
http://borg.uu3.net/cgit/cgit.cgi/dot/about/


0

คุณอาจลองใช้โรงเก็บเครื่องบิน มันเป็นผู้เล่นที่ค่อนข้างใหม่ในโลกแห่งการควบคุมข้อมูล แต่ทำได้ดีมากโดยการกำหนดเวอร์ชันเทนเซอร์แทนการกำหนดเวอร์ชันของหยด เอกสารจะต้องเป็นจุดเริ่มต้นที่ดีที่สุด เนื่องจากข้อมูลจะถูกจัดเก็บเป็นเทนเซอร์คุณควรจะสามารถใช้งานได้โดยตรงในรหัส ML ของคุณ (และตอนนี้โรงเก็บเครื่องบินมีตัวตักข้อมูลสำหรับ PyTorch และ Tensorflow) ด้วยโรงเก็บเครื่องบินคุณจะได้รับประโยชน์ทั้งหมดจากการใช้คอมไพล์เช่นการแบรนช์แบบไม่มีค่าใช้จ่ายการรวมเวลาเดินทางผ่านประวัติศาสตร์ คุณลักษณะที่ดีอย่างหนึ่งเกี่ยวกับการโคลนในโรงเก็บเครื่องบินคือคุณสามารถทำการโคลนนิ่งบางส่วนได้ ซึ่งหมายความว่าหากคุณมีข้อมูล 10 TB ที่ระยะไกลของคุณและต้องการเพียง 100 MB สำหรับการสร้างต้นแบบโมเดลของคุณคุณสามารถดึงข้อมูลเพียง 100 MB ผ่านการโคลนนิ่งบางส่วนแทนการโคลนแบบเต็ม

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