ไม่ไฟล์ไม่ได้อ่านในหน่วยความจำโดยอัตโนมัติโดยเปิดขึ้นมา นั่นจะไร้ประสิทธิภาพมาก sed
ตัวอย่างเช่นอ่านอินพุตบรรทัดต่อบรรทัดเช่นเดียวกับเครื่องมือ Unix อื่น ๆ มันไม่ค่อยจะมีให้มากกว่าเส้นปัจจุบันในหน่วยความจำ
ด้วยawk
เหมือนกัน มันอ่านบันทึกในเวลาซึ่งโดยค่าเริ่มต้นคือบรรทัด หากคุณเก็บชิ้นส่วนของข้อมูลเข้าในตัวแปรที่จะเป็นพิเศษของหลักสูตร1
บางคนมีนิสัยชอบทำสิ่งต่าง ๆ เช่น
for line in $(cat file); do ...; done
ตั้งแต่เปลือกจะมีการขยาย$(cat file)
แทนคำสั่งอย่างสมบูรณ์ก่อนที่จะใช้แม้กระทั่งการย้ำแรกของfor
วงนี้จะอ่านทั้งfile
ในหน่วยความจำ (ในหน่วยความจำที่ใช้โดยเปลือกรันfor
ห่วง) มันค่อนข้างโง่และไม่สุภาพ แต่ควรทำอย่างใดอย่างหนึ่ง
while IFS= read -r line; do ...; done <file
สิ่งนี้จะประมวลผลทีfile
ละบรรทัด (แต่ต้องอ่านทำความเข้าใจกับ "IFS = read -r line" )
การประมวลผลไฟล์ทีละบรรทัดในเปลือกจำเป็นเท่านั้นไม่ค่อย แต่เป็นสาธารณูปโภคส่วนใหญ่จะเป็นสายที่มุ่งเน้นอยู่แล้ว (ดูทำไมใช้ห่วงเปลือกกับข้อความกระบวนการพิจารณาการปฏิบัติที่ไม่ดี? )
ฉันทำงานด้านชีวสารสนเทศศาสตร์และเมื่อประมวลผลข้อมูลจีโนมจำนวนมากฉันจะไม่สามารถทำอะไรได้มากเว้นแต่ฉันจะเก็บบิตของข้อมูลที่จำเป็นอย่างยิ่งในหน่วยความจำเท่านั้น ตัวอย่างเช่นเมื่อฉันต้องการตัดบิตของข้อมูลที่สามารถใช้เพื่อระบุตัวบุคคลจากชุดข้อมูล 1 เทราไบต์ที่มีชุดตัวแปร DNA ในไฟล์ VCF (เนื่องจากข้อมูลประเภทนั้นไม่สามารถเปิดเผยต่อสาธารณะได้) ฉันจะทำทีละบรรทัด การประมวลผลด้วยawk
โปรแกรมอย่างง่าย(เป็นไปได้เนื่องจากรูปแบบ VCF เป็นแบบ line-oriented) ฉันไม่อ่านไฟล์ในหน่วยความจำประมวลผลที่นั่นและเขียนมันออกมาอีกครั้ง! หากไฟล์ถูกบีบอัดฉันจะป้อนผ่านzcat
หรือgzip -d -c
เนื่องจากgzip
การประมวลผลข้อมูลจะไม่อ่านไฟล์ทั้งหมดในหน่วยความจำ
แม้ว่าจะมีรูปแบบไฟล์ที่ไม่ได้วางแนวเหมือน JSON หรือ XML แต่ก็มีสตรีมพาร์สเซอร์ที่ทำให้สามารถประมวลผลไฟล์ขนาดใหญ่ได้โดยไม่ต้องเก็บไว้ใน RAM
ด้วยไฟล์ปฏิบัติการมันมีความซับซ้อนเล็กน้อยเนื่องจากไลบรารีที่แบ่งใช้อาจโหลดตามต้องการและ / หรือใช้ร่วมกันระหว่างกระบวนการ (ดูที่การโหลดไลบรารีที่ใช้ร่วมกันและการใช้ RAMตัวอย่างเช่น)
การแคชเป็นสิ่งที่ฉันไม่ได้กล่าวถึงที่นี่ นี่เป็นการกระทำของการใช้ RAM เพื่อเก็บข้อมูลที่เข้าถึงบ่อย ไฟล์ขนาดเล็ก (เช่นไฟล์ปฏิบัติการ) อาจถูกแคชไว้โดยระบบปฏิบัติการด้วยความหวังว่าผู้ใช้จะทำการอ้างอิงจำนวนมาก นอกเหนือจากการอ่านไฟล์ครั้งแรกการเข้าถึงที่ตามมาจะทำกับแรมมากกว่าไปยังดิสก์ การแคชเช่นการบัฟเฟอร์ของอินพุตและเอาต์พุตมักจะโปร่งใสต่อผู้ใช้และจำนวนหน่วยความจำที่ใช้ในการแคชสิ่งต่าง ๆ อาจเปลี่ยนแปลงแบบไดนามิกขึ้นอยู่กับปริมาณของ RAM ที่จัดสรรโดยแอปพลิเคชันเป็นต้น
1 ใน ทางเทคนิคโปรแกรมส่วนใหญ่อาจอ่านกลุ่มข้อมูลในแต่ละครั้งโดยใช้การกำหนดบัฟเฟอร์อย่างชัดเจนหรือโดยนัยผ่านการบัฟเฟอร์ที่ไลบรารี I / O มาตรฐานทำ มันมีประสิทธิภาพมากขึ้นในการอ่านขนาดบล็อกของดิสก์มากกว่าขนาดตัวอักษรในแต่ละครั้ง ขนาดก้อนนี้จะไม่ค่อยใหญ่กว่าหนึ่งกิโลกรัม