2011-04-14 32 views
0

我測試了不同的base64編碼器mig64,iHarder,sun等。似乎這些需要將整個數據存儲在內存中進行轉換。java中最好的多部分base 64編碼器是什麼?

如果我想以多線程的方式編碼一個大文件(流)> 1GB,可以在不破壞文件的情況下使用哪個編解碼器實現? commons編解碼器似乎有base64outputstream包裝。其他解決方案?

爲了說清楚,我有一個1TB文件,而這個文件需要編碼base64。機器內存2GB內存,在Java中最快的方法是什麼?

+0

因此,您對「最佳」的特定定義是「能夠對流進行編碼」? – 2011-04-14 18:38:53

+0

你有其他的標準嗎?正如目前所寫,這個問題是主觀的(來自標題)和/或「X列表」請求(基於最後一部分)。 – Pops 2011-04-14 18:40:09

+0

以併發的方式....讓它成爲文件ie。固定的字節流 – zudokod 2011-04-14 18:41:30

回答

1

我不確定哪個編碼器速度更快,您必須測量每個編碼器以確定。但是,您可以通過將文件拆分爲塊來避免內存問題並實現併發性。只要確保將它們分割成6個字節的邊界(因爲它在Base64中平均變爲8個字節)。

我建議選擇合理的塊大小,並使用ExecutorService來管理固定數量的線程來完成處理。你可以在他們之間分享RandomAccessFile並寫入適當的地方。您當然必須計算輸出塊偏移量(只需乘以8併除以6)。老實說,雖然你可能沒有意識到這裏有很多併發的性能增益。它可能會隨機訪問硬盤驅動器。我將首先使用單個線程分塊文件。看看這是多快第一。您可能會比您想象的更快地收縮1GB文件。作爲一個粗略的猜測,我會在現代硬件上說1分鐘,甚至寫到你正在閱讀的同一個驅動器。

+0

如何確保完整性,在76個字符之後換行後再說等等? – zudokod 2011-04-14 18:51:05

+0

我不會在換行符上分割它,你需要在固定的字節邊界上分割。如果你逐行閱讀,那麼你不能保證每行是6字節的倍數。 – WhiteFang34 2011-04-14 18:54:07

+0

我的意思是寫......輸出應該有規格,在76之後換行更大的塊。即文件被轉換爲另一個有字符的文件,根據規範 – zudokod 2011-04-14 18:58:35