Tengo un archivo de texto de 25 GB que necesita reemplazar una cadena en solo unas pocas líneas. Puedo usarlo con sed
éxito, pero lleva mucho tiempo ejecutarlo.
sed -i 's|old text|new text|g' gigantic_file.sql
¿Hay una manera más rápida de hacer esto?
sed
replace
large-files
eisaacson
fuente
fuente
Respuestas:
Puedes probar:
De esta referencia :
Aquí hay una comparación sobre un archivo 10G. Antes de:
Después:
fuente
sed
está mal escrito. Edité esta publicación ayer para arreglar el últimosed
comando que debería sertime sed -i '/original/ s//ketan/g' wiki10gb
y notime sed -i '/ketan/ s//original/g' wiki10gb
. Revertiré mi edición hoy porque 1. las veces ya no coinciden con el comando y 2. He realizado la misma prueba con GNU sed en un archivo de 3+ GB y no observo ninguna diferencia entre las dossed
alternativas. Sospecho que la diferencia en los tiempos se debe a la falta de ortografía.time
resultados personalmente, pero en general, no hubo diferencia en el tiempo.La respuesta corta es "No": su factor limitante en este tipo de operación es el disco IO. No hay forma de transmitir 25 GB de un disco más rápido. Es posible que obtenga una mejora menor si no edita en el lugar y escribe el resultado de la
sed
unidad en una unidad separada (si tiene una disponible), porque de esa manera puede leer de una, mientras escribe a otra y hay un poco menos contención como resultado.Es posible que pueda acelerarlo un poco al no usar el motor de expresiones regulares para cada línea, por lo que, por ejemplo, usando perl (estoy bastante seguro de que puede hacer esto,
sed
pero no sé la sintaxis), esto comenzará desde línea 10,000 en adelante.Y si hay algún tipo de complicaciones en los RE (metacaracteres), minimizarlos mejorará ligeramente la eficiencia del motor regex.
fuente
sed -i '10000,$ s/old_text/new_text/g'
sed
compara: supongo que es marginalmente más rápido, pero no mucho debido al tamaño del archivo.sed
enperl
, pero este último también le permite escribir guiones más prolija también.Si los textos nuevos y antiguos tienen la misma longitud, puede buscar en el archivo y escribir solo los bytes modificados, en lugar de copiar todo el archivo. De lo contrario, queda atrapado en mover muchos datos.
Nota: esto es complicado e implica escribir código personalizado.
Consulte la página de manual de fseek si está trabajando en C o C ++, o sus envoltorios de idiomas preferidos para las llamadas al sistema de búsqueda y escritura.
Si insiste en usar solo la línea de comandos y puede obtener los desplazamientos de bytes del texto, puede escribir el texto de reemplazo en su lugar con comandos "dd" cuidadosamente escritos.
fuente