Mam plik tekstowy o pojemności 25 GB, który wymaga zastąpienia ciągu tylko w kilku wierszach. Mogę używać z sed
powodzeniem, ale uruchomienie zajmuje bardzo dużo czasu.
sed -i 's|old text|new text|g' gigantic_file.sql
Czy jest na to szybszy sposób?
sed
replace
large-files
eisaacson
źródło
źródło
Odpowiedzi:
Możesz spróbować:
Z tego ref :
Oto porównanie pliku 10G. Przed:
Po:
źródło
sed
jest błędna. Wczoraj edytowałem ten post, aby naprawić ostatniesed
polecenie, które powinno być,time sed -i '/original/ s//ketan/g' wiki10gb
a nie nietime sed -i '/ketan/ s//original/g' wiki10gb
. Cofam dzisiaj swoją edycję, ponieważ 1. czasy nie są już zgodne z poleceniem i 2. Zrobiłem ten sam test z GNU sed na pliku ponad 3 GB i nie widzę żadnej różnicy między tymi dwiemased
alternatywami. Podejrzewam, że różnica w czasie wynika z błędnej pisowni.time
wynikach osobiście, ale w sumie nie było różnicy w czasie.Krótka odpowiedź brzmi „nie” - twoim ograniczeniem dla tego rodzaju operacji jest IO dysku. Nie ma możliwości szybszego strumieniowania 25 GB dysku. Możesz uzyskać niewielką poprawę, jeśli nie wprowadzisz edycji w miejscu, a wynik zapisujesz na
sed
osobnym dysku (jeśli masz jeden dostępny) - ponieważ w ten sposób możesz czytać z jednego, jednocześnie pisząc na innym i jest nieco w rezultacie mniej rywalizacji.Państwo może być w stanie przyspieszyć go trochę nie używając silnika regex dla każdej linii - tak na przykład przy użyciu Perl (Jestem całkiem pewien, że można to zrobić
sed
, ale nie wiem składni) - ten rozpocznie się od linia 10 000 wzwyż.A jeśli występują jakieś komplikacje w RE (metaznaki), wówczas ich minimalizacja nieznacznie poprawi wydajność silnika regex.
źródło
sed -i '10000,$ s/old_text/new_text/g'
sed
porównuje - zakładam nieznacznie szybciej, ale niewiele z powodu rozmiaru pliku.sed
wperl
, ale ten pozwala również napisać bardziej gadatliwy skryptów też.Jeśli nowy i stary tekst mają tę samą długość, możesz wyszukiwać w pliku i zapisywać tylko zmienione bajty, zamiast kopiować cały plik. W przeciwnym razie jesteś uwięziony w przenoszeniu dużej ilości danych.
Uwaga: jest to trudne i wymaga napisania niestandardowego kodu.
Zobacz stronę podręcznika fseek, jeśli pracujesz w C lub C ++, lub swoje ulubione języki do wyszukiwania i pisania wywołań systemowych.
Jeśli nalegasz na używanie tylko wiersza poleceń i możesz uzyskać bajtowe przesunięcia tekstu, możesz napisać tekst zastępczy za pomocą starannie napisanych poleceń „dd”.
źródło