2013-01-23 27 views
3

我的數據存儲在磁盤上的文件太大,無法存儲在主內存中。如何執行流式字符轉換?

我想從磁盤此數據通過iconv流劃分成數據處理管道,就像這樣:不幸的是

zcat myfile | iconv -f L1 -t UTF-8 | # rest of the pipeline goes here 

,我看到的iconv在內存中緩衝整個文件,直到它的輸出任何之前耗盡數據。這意味着我將所有的主內存用於管道中的阻塞操作,其內存佔用空間最小。

我打過電話的iconv這樣的:

stdbuf -o 0 iconv -f L1 -t UTF-8 

但它看起來像的iconv內部自身管理的緩衝 - 這是沒有任何與Linux管道緩衝區。

我在Arch Linux中看到與gblic 2.6和2.7一起打包的二進制文件,我在Debian中用glibc 2.5描述了它。

有沒有辦法解決這個問題?我知道流式字符轉換並不簡單,但我一直認爲這種常用的unix工具可以在流中工作;處理不適合主內存的文件並不罕見。我是否必須將自己的二進制文件鏈接到libiconv

+1

我應該把這個問題放在unix堆棧交換上嗎?無論如何,解決方案是使用'recode'命令(gnu.org/software/recode),它可以在數據流出時進行流式處理。 – Cera

回答

2

考慮使用iconv_open調用iconv(3) - 將一個簡單的C例程掛接到這兩個調用。 從標準輸入讀取,寫入標準輸出。讀一下這個例子:

http://www.gnu.org/software/libc/manual/html_node/iconv-Examples.html 

這個例子顯然是用來處理你所描述的。 - 避免「有狀態」等待數據。

+0

謝謝 - 如果我沒有找到解決方案,我認爲它會來。謝天謝地,'recode'整理出來了。 – Cera

相關問題