быстрое удаление строки с индексом из файла - PullRequest
3 голосов
/ 29 октября 2011

У меня ОГРОМНЫЙ файл 10G.Я хочу удалить строку 188888 из этого файла.

Я использую sed следующим образом:

sed -i '188888d' file

Проблема в том, что это действительно медленно.Я понимаю, что это из-за размера файла, но есть ли способ сделать это быстрее.

Спасибо

Ответы [ 2 ]

1 голос
/ 29 октября 2011

Строки файла определяются путем подсчета символа \ n, если размер строки является переменным, то вы не можете вычислить смещение по отношению к местоположению, заданному для строки, но должны подсчитать количество новых строк.

Это всегда будет O (n), где n - количество байтов в файле.

Параллельные алгоритмы также не помогают, потому что эта операция ограничена дисковым вводом-выводом, разделяй и властвуй будет еще медленнее.

Если вы будете делать это много для одного и того же файла, есть способы предварительно обработать файл и сделать его быстрее.

Простой способ - создать индекс с помощью

line#:offset

А если вы хотите найти строку, выполните двоичный поиск (Log n) по индексу нужного вам номера строки и используйте смещение, чтобы найти строку в исходном файле.

1 голос
/ 29 октября 2011

Попробуйте

sed -i '188888{;d;q;}' file

Возможно, вам придется поэкспериментировать с тем, какие из вышеперечисленных точек с запятой вы оставите, {d;q} ... - вторая попытка.

Это остановит поискПосле того, как файл удалит эту строку, вам все равно придется потратить время на перезапись файла.Также стоило бы проверить

sed '188888{;q;d;}' file > /path/to/alternate/mountpoint/newFile

, где альтернативная точка монтирования находится на отдельном диске.

окончательное редактирование Ах, еще один вариант - редактироватьфайл во время записи по каналу

 yourLogFileProducingProgram | sed -i '188888d' > logFile

Но это предполагает, что вы знаете, что данные, которые вы хотите удалить, всегда находятся в строке '188888, это возможно?

Надеюсьэто помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...