ทำไม Vim เปิดไฟล์ข้อความขนาด 100 MB เมื่อฉันมี RAM ขนาด 16 GB


67

ฉันมีไฟล์สำรองฐานข้อมูล MySQL 100MB และฉันมีปัญหาในการเปิดใน Vim บนกล่อง Linux ที่มี RAM ขนาด 16G

เป็นกลุ่มเพียงแฮงค์ (อย่างน้อยก็ใช้ไม่ได้) นี่คือสิ่งที่ฉันไม่เข้าใจ ฉันมี RAM 16 GB ทำไมฉันไม่สามารถโหลดไฟล์ 100 MB ในโปรแกรมแก้ไขได้

มันเป็นเพราะกลุ่ม? ฉันคิดว่าการจัดการหน่วยความจำทั้งหมดได้รับการจัดการโดยระบบปฏิบัติการ


3
พิจารณาใช้โปรแกรมแก้ไข HEX แทนโปรแกรมแก้ไขข้อความเพื่อดูไฟล์ดังกล่าว ตัวอย่างของการแก้ไข hex ด้วยอินเตอร์เฟซ vi hexerเหมือนจะเป็น
Ruslan

13
อย่าลืมว่าRAM ไม่ใช่สิ่งที่เราใช้หมดเมื่อเรามีหน่วยความจำไม่ได้ใช้งานมานานหลายทศวรรษแล้ว หน่วยความจำเสมือนจริงแล้ว มันถูกแบ่งออกเป็นหน้า ๆ และหน้าเหล่านั้นสามารถเปลี่ยนเป็นดิสก์ได้ จำนวนหน่วยความจำที่จัดสรรออกจากพื้นที่ที่อยู่ของกระบวนการและจำนวน RAM ที่ใช้มีน้อยมากที่จะทำซึ่งกันและกัน เมื่อคุณเรียกใช้หน่วยความจำของคุณได้วิ่งออกมาจากพื้นที่ที่อยู่ไม่RAM วิธีที่ดีที่สุดที่จะคิดว่ามันเป็นหน่วยความจำพื้นที่ดิสก์แต่ละขั้นตอนได้รับเป็นจำนวนคงที่หนึ่งของพื้นที่นั้นและRAM เป็นฮาร์ดแวร์ที่ทำให้ฮาร์ดดิสก์ของคุณได้เร็วขึ้น
Eric Lippert

21
@EricLippert ยกเว้นว่าดิสก์แบบดั้งเดิมนั้นช้ามาก (เทียบกับ RAM) ซึ่งเหมาะสำหรับการจัดเก็บหน้าหน่วยความจำเสมือนที่ไม่ได้ใช้งานอยู่เท่านั้น หากกระบวนการหยุดทำงาน (หรืออย่างน้อยก็ไม่สามารถใช้งานได้อย่างที่ OP ใช้) เนื่องจากการสลับการกระตุกเป็นไปอย่างแม่นยำเพราะ RAM เป็นสิ่งที่มันใช้หมด
depquid

6
@EricLippert ที่มีพื้นที่ว่างเหลืออยู่มีความเกี่ยวข้องเฉพาะกับระบบ 32 บิตวันนี้ ฉันสงสัยว่าผู้ใช้ที่มี 16G RAM จะยังคงใช้เคอร์เนล PAE 32 บิตแทน 64 บิตปกติ
Ruslan

3
@depquid: นั่นเป็นประเด็นที่ดี ความเห็นของฉันคือ OP ดูเหมือนว่ามีความเชื่อว่า "ฉันโหลดสิ่งต่างๆ 100MB ฉันมี RAM 16000MB ดังนั้นดังนั้น 100MB ของ RAM 16000MB ของฉันจึงถูกใช้งาน" ระบบความเชื่อนี้ล้าสมัย
Eric Lippert

คำตอบ:


69

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

ไฟล์ฐานข้อมูลอาจไม่มีอักขระขึ้นบรรทัดใหม่จำนวนมากดังนั้นอาจเป็นหนึ่งบรรทัดยาว 100 Mb เสียงเรียกเข้าจะไม่พอใจกับสิ่งนั้นและแม้ว่ามันอาจจะใช้งานได้มันอาจใช้เวลาค่อนข้างนานในการโหลดไฟล์

ฉันได้เปิดไฟล์ข้อความที่มีขนาดใหญ่กว่า 100 Mb ด้วย Vim อย่างแน่นอน ไฟล์ไม่จำเป็นต้องใส่ในหน่วยความจำเลยทีเดียว (เนื่องจาก Vim สามารถสลับการเปลี่ยนแปลงไปยังดิสก์ได้ตามต้องการ)


1
ฉันยังสังเกตเห็นบรรทัดที่ยาวมากลองกับไฟล์อื่นที่ไม่มีบรรทัดที่ยาวมากดูการปรับปรุงครั้งใหญ่ ขอบคุณ
ถามและเรียนรู้

11
@AskandLearn ขึ้นอยู่กับประเภทของไฟล์คุณอาจเห็นว่าประสิทธิภาพเพิ่มขึ้นหากคุณset synmaxcol=120(หรือบางหมายเลขที่เหมาะสมอื่น ๆ ) ฉันได้สังเกตเห็นการเร่งความเร็วขนาดใหญ่จากที่ผ่านมาในอดีต
sapi

ไม่มีใครรู้ว่าส้อม neovim ที่ผ่านมาจะจัดการกับเส้นที่ยาวกว่าดีกว่าหรือไม่ ผมคิดว่ามันไม่ได้เป็นปัญหาที่พบบ่อยโดยเฉพาะอย่างยิ่ง ...
Hemmer

@ GregHewgill มันเป็นเรื่องจริงฉันก็สังเกตเช่นนั้น แต่คุณรู้ได้อย่างไร?
ราหุลปาติล

56

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

$ mysqldump --complete-insert -u -p

นอกจากนี้คุณสามารถเปิดเป็นกลุ่มและขอให้อย่าแยก.vimrcไฟล์ของคุณหรือโหลดปลั๊กอินใด ๆ ด้วยคำสั่งนี้:

$ vim -u NONE output.sql

การโหลดเป็นกลุ่มในลักษณะนี้จะใช้หน่วยความจำน้อยกว่าและไม่ต้องการ Vim ในการแยกวิเคราะห์ไฟล์ทั้งหมดเช่นเดียวกับปลั๊กอินจำนวนมาก


15

"โหลด VIM ที่ไม่มี. vimrc และปลั๊กอิน (clean VIM) เช่นสำหรับไฟล์ขนาดใหญ่

  gvim -u NONE -U NONE -N largefile.sql

13

ลองใช้lessแทนvimหากคุณต้องการดูไฟล์ขนาดใหญ่โดยตรง Vim พยายามทำสิ่งต่าง ๆ มากมายเมื่อทำการโหลดครั้งแรก - สแกนไฟล์ (อาจมีหลายรอบ) เพื่อลองพิจารณาว่าจะใช้ไวยากรณ์ใดและการเน้นไวยากรณ์และการค้นหาแบบจำลองที่ด้านบนและด้านล่างของไฟล์ จากนั้นในขณะที่คุณแก้ไขไฟล์ vim กำลังบันทึก swapfiles และเก็บต้นไม้เลิกทำ (เลิกทำประวัติใน vim คือการแตกแขนงไม่ใช่เชิงเส้นเหมือนในเครื่องมือแก้ไขอื่น ๆ (?) ทุกรายการ) และทำการประเมินไวยากรณ์ที่เน้นการเปลี่ยนแปลงข้อความตลอดเวลา

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


ดูคำตอบของฉันสำหรับวิธีป้องกัน VIM จากการทำงานหนักเช่นการแยกไฟล์
dotancohen

ใช่การเน้นไวยากรณ์กับสิ่งต่าง ๆ เช่น XML และ SQL สามารถทำให้ไฟล์มีขนาดใหญ่ขึ้นได้ช้ามาก
Marcin

9

Vim ไม่เพียง แต่โหลดไฟล์ตามที่เป็นในหน่วยความจำ มันแปลงมันเป็นโครงสร้างภายใน (บรรทัดคำ ฯลฯ ) ดำเนินการเน้นไวยากรณ์โดยใช้ภาษาสคริปต์ภายในและอื่น ๆ ; ทั้งหมดนี้ใช้หน่วยความจำ (มากกว่าทั้งไบต์สำหรับตัวอักษร) และเวลา CPU


การใช้หน่วยความจำไม่ได้เป็นปัญหา เวลาของ CPU ที่ถ่ายขึ้น (และการหยุดค้างที่มองเห็นได้ในขณะที่คุณรอ) คือ
การแข่งขัน Lightness ใน Orbit

เวลา CPU ส่วนใหญ่นั้นใช้เวลาโดยสคริปต์การเน้นไวยากรณ์
demonkoryu

ใช่ฉันเห็นด้วย. ฉันแค่บอกว่าการใช้หน่วยความจำไม่น่าเป็นไปได้ (a) เป็นปัญหาหรือ (b) ทำให้เกิดความล่าช้านานซึ่งตรงกันข้ามกับคำตอบของคุณ
Lightness Races ใน Orbit

คุณพูดถูกฉันได้อัปเดตคำตอบแล้ว
demonkoryu


4

หวังว่าปัญหาของคุณเกี่ยวกับ VIM นั้นจำเป็นต้องใช้กับไฟล์ชั่วคราว (เช่น swap) มากกว่า RAM

ในหลายกรณีไฟล์ชั่วคราวที่สร้างโดย VIM อยู่ในไดเรกทอรีเดียวกันของไฟล์ที่คุณกำลังเปิด หากเป็นกรณีนี้สำหรับคุณคุณสามารถตรวจสอบได้โดยตรวจสอบพื้นที่ว่างในไดเรกทอรีปัจจุบัน

โชคดีที่มีเอกสารที่ดีเกี่ยวกับวิธีที่คุณสามารถระบุตำแหน่งที่แตกต่างสำหรับไฟล์การทำดัชนี / สลับของ VIM:

คุณยังสามารถปิดการใช้งานไฟล์สลับได้


1

ฉันเปิดการสำรองฐานข้อมูลขนาดใหญ่เป็นครั้งคราวในรูปแบบข้อความ. sql ไฟล์ที่มีขนาดใหญ่มากหรือไฟล์ที่มีเส้นที่ยาวมากบางครั้งดูเหมือนจะใช้เวลานานในการเปิดเป็นกลุ่ม อาจเกี่ยวข้องกับการประมวลผลไวยากรณ์และการเน้นสีตามที่ระบุไว้ในคำตอบโดย @zzapper และ @demonkoryu

วิธีแก้ปัญหาอย่างรวดเร็วอาจเป็นการกด "control-G" ในระหว่างการโหลดไฟล์เพื่อยกเลิกการเน้นไวยากรณ์ที่ประมวลผลล่วงหน้า

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