Ошибка сегментации при использовании регулярного выражения perl для большого файла - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь найти и заменить шаблон в очень большом файле (43 Go) и столкнулся с некоторыми проблемами. Сначала я попытался использовать sed для этого, но он не оптимизирован для больших файлов, даже меньше, чем 43 Go, поэтому я переключился на perl.

У меня есть эта команда: perl -0777 -i -pe 's/(public\..)*_seq/\1_id_seq/mg' dump.sql

Но она генерирует ошибку сегментации перед выходом и преобразует мой дамп с 43 Go в файл с 0 октетами. Файл, который я пытаюсь проанализировать, представляет собой простой postgresql дамп базы данных.

Так же, как информация:

# perl --version

This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64-linux-gnu-thread-multi
(with 67 registered patches, see perl -V for more detail)

Кто-то уже сталкивался с этой проблемой или есть идеи о том, как ее решить? это ? Я бы предпочел оставить эту однострочную команду python, но если у вас есть решения с любой другой программой, я возьму ее тоже

1 Ответ

2 голосов
/ 09 января 2020

-0777 указывает perl загрузить весь файл в память (см. perlrun ). Если ваша память меньше 43 Go (какой бы она ни была), вам нужно будет найти способ обработать ее небольшими порциями. Например, попробуйте сбросить этот параметр или используйте -00 для «режима абзаца».

Также обратите внимание, что, в отличие от sed, вам нужно использовать $1 вместо \1 в заменяемой части замещения в Perl.

...