Ваша идея неверна с использованием цикла оболочки для обработки текста. Вы открываете один новый файловый дескриптор для перенаправления в выходной файл для каждой из 30233088 итераций вашего входного файла. Он подвержен огромному влиянию на производительность или нехватке дескрипторов открытых файлов.
Используйте правильный инструмент для работы. Awk
твой друг здесь. Если, как вы говорите, sequence.txt
- это просто огромный шаблон, вы можете просто поместить его в переменную для соответствия регулярному выражению, как показано ниже. Решения не требуют дополнительных затрат памяти для хранения записей в ОЗУ
awk -v sequence="$(<sequence.txt)" 'n=index(sequence, $1){print n":"$1}' mystringfile.txt
Это должно быть относительно быстрее, чем ваш подход, и чтобы ускорить процесс, измените ваши настройки locale
, чтобы они соответствовали C
local,
LC_ALL=C awk -v sequence="$(<sequence.txt)" 'n=index(sequence, $1){print n":"$1}' mystringfile.txt
Чтобы сопоставить с grep
опцией -b
для печати начала смещения байта, используйте n-1
в ответе выше вместо просто n
.
Если вы все еще хотите использовать GNU параллельно, используйте --pipepart
, чтобы физически разбить файл на части, и укажите размер --block
, сколько МБ содержимого файла для чтения
parallel -a mystringfile.txt --pipepart --block=20M -q awk -v sequence="$(<sequence.txt)" 'n=index(sequence, $1){print n":"$1}'