У меня есть текстовый файл 25 ГБ, который нуждается в замене строки только на несколько строк. Я могу sed
успешно использовать, но это занимает очень много времени для запуска.
sed -i 's|old text|new text|g' gigantic_file.sql
Есть ли более быстрый способ сделать это?
sed
replace
large-files
eisaacson
источник
источник
Ответы:
Можешь попробовать:
Из этой ссылки :
Вот сравнение с файлом 10G. До:
После:
источник
sed
ошибкой. Я вчера редактировал этот пост, чтобы исправить последнююsed
команду, которая должна быть,time sed -i '/original/ s//ketan/g' wiki10gb
а неtime sed -i '/ketan/ s//original/g' wiki10gb
. Сегодня я возвращаю свое редактирование, потому что: 1. времена больше не соответствуют команде и 2. я провел тот же тест с GNU sed для файла размером 3+ ГБ и не вижу никакой разницы между этими двумяsed
альтернативами. Я подозреваю, что разница во времени связана с ошибкой.time
лично видел много колебаний в результатах, но в целом разницы во времени не было.Короткий ответ - «Нет» - ваш ограничивающий фактор для такого рода операций - дисковый ввод-вывод. Нет возможности потоковой передачи 25 ГБ диска быстрее. Вы можете получить небольшое улучшение, если вы не редактируете на месте, и вы записываете результат на
sed
отдельный диск (если у вас есть один доступный) - потому что таким образом вы можете читать с одного, в то время как запись на другой, и есть немного меньше разногласий в результате.Вы могли бы немного ускорить его, не используя движок регулярных выражений для каждой строки - например, с помощью perl (я уверен, что вы можете сделать это с
sed
помощью синтаксиса, но я не знаю) - это начнется с линия 10 000 и далее.И если есть какие-либо сложности в RE (метасимволы), то их минимизация немного повысит эффективность движка регулярных выражений.
источник
sed -i '10000,$ s/old_text/new_text/g'
sed
сравнивать - я полагаю, немного быстрее, но не сильно из-за размера файла.sed
вperl
, но последний также позволяет писать более многословным скрипты тоже.Если новый и старый тексты имеют одинаковую длину, вы можете искать в файле и записывать только измененные байты вместо копирования всего файла. В противном случае вы попадаете в ловушку большого количества данных.
Примечание: это сложно и требует написания собственного кода.
См. Справочную страницу для fseek, если вы работаете в C или C ++, или ваши любимые языковые оболочки для системных вызовов поиска и записи.
Если вы настаиваете на использовании только командной строки и можете получить байтовые смещения текста, вы можете написать заменяющий текст на месте с помощью тщательно написанных команд «dd».
источник