Brian Kernighan อธิบายในวิดีโอนี้ถึงการดึงดูดเบลล์แล็บในช่วงต้นให้กับภาษา / โปรแกรมเล็ก ๆ
เครื่องจักรขนาดใหญ่จะเป็น 64 k-bytes - K ไม่ใช่ M หรือ G - และนั่นหมายความว่าโปรแกรมแต่ละโปรแกรมไม่สามารถมีขนาดใหญ่มากดังนั้นจึงมีแนวโน้มที่จะเขียนโปรแกรมขนาดเล็กและกลไกของท่อ โดยทั่วไปการเปลี่ยนเส้นทางอินพุตเอาต์พุตทำให้สามารถเชื่อมโยงโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่งได้
แต่ฉันไม่เข้าใจว่าวิธีนี้จะ จำกัด การใช้หน่วยความจำอย่างไรเนื่องจากต้องเก็บข้อมูลใน RAM เพื่อส่งระหว่างโปรแกรม
จากวิกิพีเดีย :
ในระบบที่เหมือนยูนิกซ์ส่วนใหญ่กระบวนการทั้งหมดของไปป์ไลน์จะเริ่มพร้อมกันมีการเชื่อมต่อกับสตรีมอย่างเหมาะสมและจัดการโดยตัวกำหนดตารางเวลาร่วมกับกระบวนการอื่น ๆ ทั้งหมดที่ทำงานบนเครื่อง สิ่งสำคัญในเรื่องนี้คือการตั้งค่าท่อ Unix นอกเหนือจากการใช้งานไปป์อื่น ๆ คือแนวคิดของการบัฟเฟอร์: ตัวอย่างเช่นโปรแกรมส่งอาจสร้าง 5,000 ไบต์ต่อวินาทีและโปรแกรมรับอาจยอมรับได้ 100 ไบต์ต่อวินาทีเท่านั้น แต่ไม่มี ข้อมูลสูญหาย แต่ผลลัพธ์ของโปรแกรมส่งจะถูกเก็บไว้ในบัฟเฟอร์แทน เมื่อโปรแกรมรับข้อมูลพร้อมที่จะอ่านข้อมูลโปรแกรมถัดไปในไปป์ไลน์จะอ่านจากบัฟเฟอร์ ใน Linux ขนาดของบัฟเฟอร์คือ 65536 ไบต์ (64KB) ตัวกรองบุคคลที่สามโอเพนซอร์สที่เรียกว่า bfr พร้อมให้บริการบัฟเฟอร์ที่มีขนาดใหญ่ขึ้นหากจำเป็น
สิ่งนี้ทำให้ฉันสับสนมากยิ่งขึ้นเนื่องจากนี่เป็นการเอาชนะจุดประสงค์ของโปรแกรมขนาดเล็กได้อย่างสมบูรณ์ (แม้ว่ามันจะเป็นแบบแยกส่วนได้จนถึงระดับหนึ่ง)
สิ่งเดียวที่ฉันคิดว่าเป็นวิธีแก้ปัญหาสำหรับคำถามแรกของฉัน (ข้อ จำกัด ของหน่วยความจำที่มีปัญหาขึ้นอยู่กับข้อมูลขนาด) จะเป็นชุดข้อมูลขนาดใหญ่ที่ไม่ได้คำนวณย้อนกลับไปแล้วและท่อปัญหาที่แท้จริง จำนวนหน่วยความจำที่โปรแกรมต้องการ แต่ให้ข้อความที่เป็นตัวหนาในเครื่องหมายคำพูดของ Wikipedia แม้แต่สิ่งนี้ทำให้ฉันสับสน: เนื่องจากไม่มีโปรแกรมหนึ่งรายการในเวลาเดียวกัน
ทั้งหมดนี้จะช่วยได้มากถ้าใช้ไฟล์ temp แต่ฉันเข้าใจว่าไพพ์ไม่ได้เขียนลงดิสก์ (ยกเว้นว่าใช้ swap)
ตัวอย่าง:
sed 'simplesubstitution' file | sort | uniq > file2
เป็นที่ชัดเจนสำหรับฉันที่sed
กำลังอ่านไฟล์และแยกออกเป็นรายบรรทัด แต่sort
เป็น BK ระบุในวิดีโอที่เชื่อมโยงเป็นหยุดเต็มดังนั้นข้อมูลทั้งหมดจะต้องมีการอ่านในหน่วยความจำ (หรือไม่ได้?) แล้วก็ผ่านไปuniq
ซึ่ง (ในใจของฉัน) จะเป็นหนึ่ง โปรแกรมออนไลน์ แต่ระหว่างไพพ์แรกและท่อที่สองข้อมูลทั้งหมดจะต้องอยู่ในหน่วยความจำใช่ไหม?
unless swap is used
แลกเปลี่ยนนั้นจะใช้เมื่อมีไม่เพียงพอ RAM