5

我将数据存储在磁盘中的文件太大而无法存储在主内存中。

我想通过 将这些数据从磁盘流式传输到数据处理管道中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

4

1 回答 1

2

考虑带有 iconv_open 的 iconv(3) 调用——将一个简单的 C 例程挂接到这两个调用。从标准输入读取,写入标准输出。阅读此示例:

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

此示例明确旨在处理您所描述的内容。- 避免“有状态”等待数据。

于 2013-01-23T04:40:11.373 回答