2016-08-18 26 views
0

我有一個很大的文本文件(大約10GB),它適合內存沒有任何問題。我的目標是將每一行轉換爲base64字符串。目前我的方法需要永久,因爲它是單線程的,似乎並不完整。Base64編碼逐行更快的方式

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

有人能給我一個提示如何更快地做到這一點嗎?此解決方案每小時創建大約100MB(因此修整時間爲100小時),CPU使用率爲5%,磁盤使用率也非常低。

看來我得到了missunderstood有關控制字符... 所以,我包括示例文本文件,輸出應該如何(chepner是與格格正確):

樣品輸入:

Банд`Эрос 
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 

So樣本是每次更好然後人類聲明; =)

+1

echo的哪個版本支持'-i'選項? – chepner

+0

默認情況下,'base64'將換行符插入長編碼行中;你可能想通過使用'-w0'選項來避免這種情況。如果您的輸入文件包含NUL(這意味着它不是一個真正的文本文件),那麼它們將不會通過讀入shell變量來保存。 – 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(我忽略/隱藏不可打印的字符,換行符爲n)...我無法在$ _中適用它,所以你的編碼不​​考慮這一點。但它非常快,大約200MB/5秒。 – snapo

+0

perl行與運行'base64 outputfile.txt'相同 - 但不會像逐行讀取輸入一樣產生相同的輸出(不同之處在於新行保留在慢速版中)。 – gilez

+0

@gilez不,它不是;輸入文件的每一行都被分別編碼和打印。 – chepner