2016-08-18 1 views
0

У меня есть большой текстовый файл (около 10 ГБ), который подходит без проблем в памяти. Моя цель - преобразовать каждую строку в строку base64. В настоящее время мой метод берет навсегда и, кажется, не завершается, потому что он однопоточный.Base64 кодирование линии за строкой более быстрый способ

while read line; do echo -n -i $line | base64 >> outputfile.txt; done < inputfile.txt 

Может кто-нибудь дать мне подсказку, как это сделать быстрее? Это решение создает около 100 МБ в час (так что время финиширования составит 100 часов). Потребление процессора составляет 5%, а использование диска очень низкое.

Кажется, я получил missunderstood о контрольных символов ... Так я включал текстовый файл образца, и как результат должен быть (chepner верна с Chomp):

Пример ввода:

Банд`Эрос 
testè!?£$ 
`` 
▒``▒` 

Примера вывод:

[email protected] ~ # head -n 5 bash-script-output.txt 
0JHQsNC90LRg0K3RgNC+0YE= 
dGVzdMOoIT/CoyQ= 
YGA= 
4paSYGDilpJg 

[email protected] ~ # head -n 5 perl-without-chomp.txt 
0JHQsNC90LRg0K3RgNC+0YEK 
dGVzdMOoIT/CoyQK 
YGAK 
4paSYGDilpJgCg== 

[email protected] ~ # head -n 5 perl-chomp.txt 
0JHQsNC90LRg0K3RgNC+0YE= 
dGVzdMOoIT/CoyQ= 
YGA= 
4paSYGDilpJg 

Так образцы каждый раз лучше, чем человеческие декларации; =)

+1

Какая версия 'echo' поддерживает опцию' -i'? – chepner

+0

По умолчанию 'base64' вставляет новые строки в длинные кодированные строки; вы, вероятно, захотите этого избежать, используя опцию '-w0'. И если ваш входной файл содержит NUL (что означало бы, что это не текстовый файл), то они не будут сохранены путем чтения в переменную оболочки. – rici

ответ

2

Это может немного помочь, чтобы открыть выходной файл только один раз:

while IFS= read -r line; do echo -n $line | base64; done <inputfile.txt> outputfile.txt 

bash не хороший выбор здесь, однако, по двум причинам: итерация файл медленно, чтобы начать с, и вы начиная новый процесс для каждой линии. Лучше всего использовать язык, на котором есть библиотека для вычисления значений base64, так что все обрабатывается в одном процессе. Пример с использованием Perl

perl -MMIME::Base64 -ne 'print encode_base64($_)' inputfile.txt > outputfile.txt 
+0

Я использую echo -n -i (i для игнорирования/скрытия непечатаемых символов, n для новой строки) ... i не смог поместиться в $ _, поэтому ваша кодировка не учитывает это. Но это довольно быстро, около 200 МБ/5 секунд. – snapo

+0

Линия perl такая же, как и 'base64 outputfile.txt' - но не производит тот же вывод, что и чтение строки за строкой (разница в символах новой строки поддерживается в медленной версии). – gilez

+0

@ gilez Нет, это не так; каждая строка входного файла кодируется и печатается отдельно. – chepner

 Смежные вопросы

  • Нет связанных вопросов^_^