2013-01-23 28 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