I / O กลยุทธ์สำหรับปัญหาการคำนวณกับชุดข้อมูลขนาดใหญ่?


15

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

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

สิ่งที่ฉันอยากรู้คือกลยุทธ์ที่มีประสิทธิภาพที่สุดในการจัดการ I / O ของชุดข้อมูลขนาดใหญ่เป็นสคริปต์ ปกติแล้วเราจะใช้สคริปต์ที่ใช้ Python เพราะมันทำให้การเข้ารหัสไฟล์ I / O น้อยกว่า C หรือ Fortran แต่เมื่อเรามีบรรทัดที่ต้องประมวลผลเป็นสิบหรือร้อยล้านก็ไม่ชัดเจนว่าวิธีที่ดีที่สุดคืออะไร . เราควรพิจารณาทำส่วนไฟล์อินพุตของรหัสใน C หรือกลยุทธ์อื่นมีประโยชน์มากกว่าหรือไม่ (จะโหลดล่วงหน้าทั้งอาเรย์ลงในหน่วยความจำได้ดีกว่าชุดของการอ่านตามลำดับของ "chunks" (ลำดับเมกะไบต์) หรือไม่

หมายเหตุเพิ่มเติมบางส่วน:

  • เรากำลังมองหาเครื่องมือการเขียนสคริปต์เป็นหลักสำหรับการโพสต์การประมวลผลมากกว่าเครื่องมือ "ออนไลน์" ดังนั้นการใช้ Python

  • D=16LimΔเสื้อ(x(เสื้อ+Δเสื้อ)-x(เสื้อ))2

คำตอบ:


6

ฉันสมมติว่าคำถามของคุณมาจากการสังเกตว่า I / O ทำให้เกิดค่าใช้จ่ายที่สำคัญในการวิเคราะห์ทั้งหมดของคุณ ในกรณีนี้คุณสามารถลองซ้อน I / O ด้วยการคำนวณ

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

ตัวอย่างง่ายๆหากคุณสำรวจไฟล์เพียงครั้งเดียวและประมวลผลแต่ละบรรทัดหรือชุดของบรรทัดคุณสามารถแบ่งสตรีมในหน่วยของบรรทัด (หรือ MB) จากนั้นในการวนซ้ำแต่ละครั้งคุณสามารถโหลด chunk i + 1 ขณะประมวลผล chunk i

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

---- เวอร์ชันขยายหลังจากให้รายละเอียดเพิ่มเติม ----

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

  • ถ้าเปอร์เซ็นต์ของ I / O ต่ำ (ต่ำเหมือนคุณไม่สนใจค่าใช้จ่ายไม่ว่าจะเป็น: 0.5%, 2%, 5%, ... ) จากนั้นใช้วิธีการง่ายๆ: โหลดข้อมูล ในครั้งเดียวและคำนวณ คุณจะประหยัดเวลาสำหรับแง่มุมที่น่าสนใจของการวิจัยของคุณ

  • หากคุณไม่สามารถจ่ายค่าโสหุ้ยคุณอาจต้องการตรวจสอบสิ่งที่ Pedro แนะนำ จำสิ่งที่ Aron Ahmadia พูดถึงและทดสอบก่อนที่จะนำไปใช้อย่างสมบูรณ์

  • n2n

    load chunk1 และ chunk2
    สำหรับชิ้น i = 1 ถึง n
        โหลดก้อนแบบอะซิงโครนัส i + 1
        สำหรับชิ้นใน j = i + 1 ถึง n
            โหลดก้อนแบบอะซิงโครนัส j + 1
            คำนวณด้วยชิ้น i, j (* สำหรับการคำนวณซ้ำครั้งแรกนี่คือชิ้นส่วนที่โหลดล่วงหน้า 1 และ 2 *)

หมายเหตุ: นี่เป็นรหัสปลอมที่รวดเร็วและสกปรกใครจะต้องปรับดัชนี

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

ฉันขอโทษฉันไม่สามารถอ้างอิงที่ดีได้ในขณะนี้

[1] อัลกอริธึม out-of-core รวมเอากลไกบางอย่างในการจัดการข้อมูลที่อยู่บนดิสก์ พวกเขาถูกเรียกว่า out-of-core ซึ่งต่างจาก in-core ("in-RAM")


7

ฉันต้องจัดการกับปัญหาที่คล้ายกันก่อนหน้านี้และวิธีแก้ปัญหาที่ฉันชอบคือการใช้I / O หน่วยความจำที่แมปแม้ว่าใน C ...

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

การค้นหาอย่างรวดเร็วของ Google บอกฉันว่านี่ยังใช้งานได้กับ Python: 16.7 mmap - รองรับไฟล์หน่วยความจำที่แมปแต่ฉันไม่รู้จัก Python มากพอที่จะบอกได้ว่ามันเหมือนกันหรือไม่


1
เพียงตรวจสอบให้แน่ใจว่าคุณวัดและทดสอบก่อนที่จะนำไปใช้กับmmapโค้ดหลักของคุณ ระบบปฏิบัติการสมัยใหม่หลายแห่งให้ประสิทธิภาพที่คล้ายคลึงกันระหว่างปกติและreadมีความซับซ้อนน้อยกว่า (นอกจากนี้ใช่ mmap ใน Python ยังมีอินเตอร์เฟสแบบพกพาสำหรับแมปหน่วยความจำ Windows และ UNIX)
Aron Ahmadia

1

บางทีคุณอาจใช้ Cython ในไฟล์ I / O ของคุณและแปลงส่วนนี้เป็นรหัส C?

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