วิธีแก้ไขไฟล์ข้อความหลายกิกะไบต์ Vim ไม่ทำงาน = ([ปิด]


112

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


ฉันได้โหลดไฟล์เก็บข้อมูลขนาดใหญ่เป็นกลุ่มแล้วและจัดการได้โดยไม่มีปัญหา
Rook

ขึ้นอยู่กับความต้องการในการแก้ไขของคุณคุณอาจสามารถไปป์ผ่านสิ่งต่างๆเช่น sed หรือ perl เพื่อค้นหาและแทนที่
El Yobo

23
จริงๆแล้วมันไม่ใช่เรื่องนอกประเด็นโปรแกรมเมอร์หลายคนใช้ vim บางครั้งเป็นส่วนเสริมของตัวแก้ไข UI หัวข้อคำถามเกี่ยวกับปัญหาที่แท้จริง เราทุกคนรู้จักเครื่องมือของกองทัพสวิสที่ดีเพียงสองอย่างสำหรับงานประเภทนี้ดังนั้นโปรดอย่ามองว่าคนกลุ่มนี้เป็นสิ่งแปลกใหม่หรือนอกสถานที่เกินไป ดังนั้นสำหรับคน
Sławomir Lenart

แทนที่จะปิดมันทำไมไม่ย้ายไปที่ SuperUser หรือ Linux / Unix หรือ VIM ล่ะ?
user1271772

คำตอบ:


72

ถ้าคุณอยู่ในระวัง * (และสมมติว่าคุณมีการปรับเปลี่ยนเพียงบางส่วนของไฟล์ (และไม่ค่อย)), คุณอาจแยกไฟล์ (โดยใช้splitคำสั่ง), แก้ไขพวกเขาที (ใช้awk, sedหรือสิ่งที่คล้ายกัน) และเชื่อมพวกเขาหลังจากที่คุณ เสร็จสิ้น.

cat file2 file3 >> file1

10
เคล็ดลับที่ดี ฉันมีไฟล์ sql ขนาด 13GB (152.000.000 เส้น) และเพียงแค่ใช้ "แยก -l 1000000" จากนั้นแก้ไขไฟล์หนึ่งล้านบรรทัดที่ฉันต้องการด้วย vim ก็ใช้งานได้ดี ใช้เวลา 10 นาทีในการแยกพวกมัน (ฉันพยายามเปิดไฟล์ต้นฉบับด้วย vim และมันใช้งานได้ แต่มันช้าเกินไปที่จะใช้งานได้)
Claes Mogren

149

Ctrl-C จะหยุดการโหลดไฟล์ หากไฟล์มีขนาดเล็กพอคุณอาจโชคดีได้โหลดเนื้อหาทั้งหมดและเพิ่งฆ่าขั้นตอนการโหลดโพสต์ ตรวจสอบว่าโหลดทั้งไฟล์แล้วเมื่อใช้เคล็ดลับนี้

Vim สามารถจัดการไฟล์ขนาดใหญ่ได้ดี ฉันเพิ่งแก้ไขไฟล์ 3.4GB ลบบรรทัด ฯลฯ สามสิ่งที่ควรทราบ:

  1. กด Ctrl-C: Vim พยายามอ่านทั้งไฟล์ในตอนแรกทำสิ่งต่างๆเช่นการเน้นไวยากรณ์และจำนวนบรรทัดในไฟล์เป็นต้น Ctrl-C จะยกเลิกการแจงนับนี้ (และการเน้นไวยากรณ์) และจะโหลดเฉพาะสิ่งที่ จำเป็นต้องแสดงบนหน้าจอของคุณ
  2. อ่านอย่างเดียว: กลุ่มอาจจะเริ่มอ่านอย่างเดียวเมื่อไฟล์มีขนาดใหญ่เกินกว่าที่จะสร้างไฟล์. คัดลอกไฟล์เพื่อดำเนินการแก้ไข ฉันต้อง w! เพื่อบันทึกไฟล์และนั่นคือช่วงเวลาที่ใช้เวลามากที่สุด
  3. ไปที่บรรทัด: การพิมพ์:115355จะนำคุณไปยังบรรทัด 115355 ซึ่งเร็วกว่ามากในไฟล์ขนาดใหญ่เหล่านั้น Vim ดูเหมือนจะเริ่มการสแกนตั้งแต่เริ่มต้นทุกครั้งที่โหลดบัฟเฟอร์ของบรรทัดและกด Ctrl-F ค้างไว้เพื่อสแกนไฟล์ดูเหมือนว่าจะช้ามากเมื่อใกล้ถึงจุดสิ้นสุด

หมายเหตุ - หากอินสแตนซ์ Vim ของคุณเป็นแบบอ่านอย่างเดียวเนื่องจากคุณกด Ctrl-C อาจเป็นไปได้ว่า Vim ไม่ได้โหลดไฟล์ทั้งหมดลงในบัฟเฟอร์ ถ้าเกิดว่าบันทึกจะบันทึกสิ่งที่อยู่ในบัฟเฟอร์ไม่ไฟล์ทั้งหมด คุณอาจตรวจสอบอย่างรวดเร็วด้วยการGข้ามไปยังจุดสิ้นสุดเพื่อให้แน่ใจว่าทุกบรรทัดในไฟล์ของคุณอยู่ที่นั่น


14
สามารถจัดการกับดัมพ์ xml วิกิพีเดีย 44 กิกะไบต์ในกลุ่มโดยใช้คำแนะนำนี้ (Ctrl-C)
vancan1ty

1
พยายามอ่านส่วนท้ายของไฟล์บันทึก 2.5GB บน windows การเปิดใน gvim ส่งผลให้หน่วยความจำเกิดข้อผิดพลาดเมื่อมีการจัดสรรหน่วยความจำเกิน 2GB เมื่อลองใช้เคล็ดลับ ctrl-c มันหยุดโหลดไฟล์ลงในหน่วยความจำ แต่อนุญาตให้ดูเฉพาะส่วนของไฟล์ที่ gvim สามารถโหลดได้ ฉันจึงรอนานขึ้นก่อนที่จะกด ctrl-c ฉันก็ยิ่งเห็นไฟล์มากขึ้น การนำทางไปยังจุดสิ้นสุดของไฟล์หรือการโหลดไฟล์ที่เหลือเป็นไปไม่ได้ (หรือฉันไม่รู้วิธี) น่าเสียดายที่กลุ่มไม่ได้ทำงาน: (ในที่สุดฉันก็ใช้เครื่องมือเฉพาะฟรีเพื่อแบ่งไฟล์เป็นไฟล์ 100MB
slawek

14
ไม่ได้ผลสำหรับฉัน ฉันโหลดไฟล์ 3GB กด ctrl-c จากนั้นเนื้อหาจะปรากฏขึ้น ฉันสามารถแก้ไขการเลื่อน ฯลฯ แต่เมื่อฉันไปถึงจุดสิ้นสุดของส่วนที่โหลด (สมมติว่า 5%) มันจะไม่โหลดอีกต่อไป (ฉันติดอยู่กับส่วนของไฟล์ที่โหลดในตอนแรกจนถึงจุดที่ฉันกด ctrl-c)
Patryk

1
ยืนยันแล้ว user3338098 หากคุณกด Ctrl-C และไม่โหลดทั้งไฟล์ (ตามที่คนอื่นพูดถึง) การบันทึกจะบันทึกเฉพาะสิ่งที่คุณโหลดเท่านั้น นั่นอาจเป็นเหตุผลว่าทำไมจึงเป็นแบบอ่านอย่างเดียวตั้งแต่แรก ฉันจะอัปเดตจุดอ่านอย่างเดียวเพื่อให้ทราบว่า
Aaron R.

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

75

อาจเป็นปลั๊กอินที่ทำให้หายใจไม่ออก (การเน้นไวยากรณ์การพับ ฯลฯ )

คุณสามารถเรียกใช้กลุ่มโดยไม่ต้องใช้ปลั๊กอิน

vim -u "NONE" hugefile.log

เป็นแบบเรียบง่าย แต่อย่างน้อยก็ให้การเคลื่อนไหวแบบ vi ที่คุณคุ้นเคย

syntax off

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


3
ยังคงโหลดไฟล์ทั้งหมดใน RAM ...
Totor

@Totor ใช่ฉันจะแยกไฟล์ก่อน แต่การตั้งค่านั้นจะทำให้คุณได้รับประสิทธิภาพที่ดีที่สุดอย่างรวดเร็วโดยการปิดคำสั่งอัตโนมัติแบบสุ่ม นั่นคือประเด็นของฉัน เวิร์คสเตชั่นที่มีหน่วยความจำที่ดีควรสามารถจัดการไฟล์ที่ใกล้จะมีกิ๊กได้
michael

2
ดังนั้น vim / vi จึงไม่มีประโยชน์เมื่อไฟล์มีขนาด 10 เท่าของหน่วยความจำเสมือน?
user3338098

1
ฉันใช้คำสั่งนี้เพื่อเปิดไฟล์ 250MB ในเวลาไม่ถึง 2 วินาที Amazing
user674669

20

การปรับปรุงคำตอบที่ได้รับจาก @Al pachio ด้วยโซลูชันแยก + เป็นกลุ่มคุณสามารถอ่านไฟล์ด้วย glob ได้อย่างมีประสิทธิภาพโดยใช้ส่วนไฟล์เป็นบัฟเฟอร์เช่น

$ split -l 5000 myBigFile
xaa
xab
xac
...

$ vim xa*
#edit the files

:nw  #skip forward and write
:n!  #skip forward and don't save 

:Nw  #skip back and write
:N!  #skip back and don't save

15

คุณอาจต้องการตรวจสอบปลั๊กอิน VIMนี้ซึ่งปิดใช้งานคุณลักษณะกลุ่มบางอย่างเพื่อความรวดเร็วในการโหลดไฟล์ขนาดใหญ่


8

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

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

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

เมื่อไม่ได้ผล (เช่นในกรณีของคุณ) คุณมีเพียงไม่กี่ตัวเลือก คุณสามารถเขียนโปรแกรมเล็ก ๆ น้อย ๆ เพื่อทำการเปลี่ยนแปลงที่คุณต้องการ (ตัวอย่างเช่นค้นหาและแทนที่) คุณสามารถใช้โปรแกรมบรรทัดคำสั่งที่อาจทำได้ (อาจทำได้ด้วย sed / awk / grep / etc?)

หากไม่ได้ผลคุณสามารถแบ่งไฟล์ออกเป็นชิ้น ๆ ได้ตลอดเวลา (บางอย่างเช่นการแยกเป็นตัวเลือกที่ชัดเจน แต่คุณสามารถใช้ head / tail เพื่อให้ได้ส่วนที่คุณต้องการ) จากนั้นแก้ไขส่วนที่ต้องการ และรวมตัวกันใหม่ในภายหลัง

เชื่อฉันเถอะว่าลองหาวิธีอื่น


3
โดยปกติแล้ว sed จะเป็นเพื่อนของคุณในกรณีเช่นนี้ บรรณาธิการของคุณไม่ชอบความคิดที่จะแทรกอักขระสองสามตัวที่ด้านบนของไฟล์และหาวิธีผลักทุกอย่างลง
dkretz

@le dorfier: ใช่ ฉันใช้ sed เมื่อฉันต้องค้นหา / แทนที่ เมื่อฉันต้องลบสองสามบรรทัดจากไฟล์แบบนั้น (ไม่กี่บรรทัดที่ยาวอย่างบ้าคลั่ง ) ฉันจัดการเป็นกลุ่ม แต่อย่างที่คุณสามารถเดาได้ว่าการย้ายระหว่างบรรทัด (เช่นเดียวกับการลบจริง) ใช้เวลาไม่น้อย (วินาที + เพื่อตอบสนองและวาดใหม่) ฉันไม่ต้องการพยายามเพิ่มตัวอักษรสองสามตัวในบรรทัดใดบรรทัดหนึ่ง
MBCook

ปัญหาเดียวกันเป๊ะ .... คำสั่ง "ใช้" ที่ด้านบนของสคริปต์ SQL สำหรับตารางขนาดใหญ่หรือกลุ่มไฟล์ที่ไม่มีอยู่ในระบบเป้าหมาย ฉันใช้ Free File Splitter เพื่อหยุดพวกมันบรรทัดคำสั่งด้านล่างเพื่อเข้าร่วมอีกครั้ง
EBarr

6

ฉันคิดว่าเป็นเรื่องปกติพอสมควรสำหรับตัวแก้ไขฐานสิบหกในการจัดการไฟล์ขนาดใหญ่ ใน Windows ฉันใช้HxDซึ่งอ้างว่าจัดการไฟล์ได้ถึง 8 EB (8 พันล้านกิกะไบต์)


14
ฉันสนใจที่จะรู้ว่าพวกเขาทดสอบอย่างไร ... : P
Shadow

สำหรับ linux ฉันขอแนะนำhexedit
elig

4

ฉันใช้ vim 7.3.3 บน Win7 x64 กับปลั๊กอิน LargeFile โดย Charles Campbellเพื่อจัดการไฟล์ข้อความธรรมดาหลายกิกะไบต์ มันใช้งานได้ดีจริงๆ

ฉันหวังว่าคุณจะมาถูกทาง


คุณจะปิดการใช้งานปลั๊กอินได้อย่างไร? เช่นรับส่วนขยายอื่น ๆ ทั้งหมดเช่นการไฮไลต์ให้ทำงานอีกครั้งเมื่อเปิดไฟล์ใน Vim?
hhh

3

ว้าวไม่เคยได้รับการทำให้หายใจไม่ออกแม้จะมี GB หรือสอง ฉันได้ยินมาว่า UltraEdit (บน Windows) และ BBEdit (บน Macs) เหมาะสำหรับไฟล์ที่มีขนาดใหญ่กว่า แต่ฉันไม่มีประสบการณ์ส่วนตัว




2

ฉันใช้โปรแกรมแก้ไข / วิวเวอร์ในตัวของ FAR Commander สำหรับไฟล์บันทึกขนาดใหญ่พิเศษ



1

สิ่งเดียวที่ฉันสามารถใช้สำหรับบางอย่างเช่นนั้นคือโปรแกรมแก้ไข Mac hex ที่ฉันชอบคือ 0XED อย่างไรก็ตามนั่นคือไฟล์ที่ฉันคิดว่ามีขนาดใหญ่หลายสิบเมกะไบต์ ฉันไม่แน่ใจว่ามันจะไปได้ไกลแค่ไหน ฉันค่อนข้างแน่ใจว่ามันโหลดเฉพาะบางส่วนของไฟล์ลงในหน่วยความจำในครั้งเดียว


0

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

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